%{ /* deffilep.y - parser for .def files */
-/* Copyright 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2006,
- 2007, 2009 Free Software Foundation, Inc.
+/* Copyright (C) 1995-2016 Free Software Foundation, Inc.
This file is part of GNU Binutils.
#define yylval def_lval
#define yychar def_char
#define yydebug def_debug
-#define yypact def_pact
-#define yyr1 def_r1
-#define yyr2 def_r2
-#define yydef def_def
-#define yychk def_chk
-#define yypgo def_pgo
-#define yyact def_act
+#define yypact def_pact
+#define yyr1 def_r1
+#define yyr2 def_r2
+#define yydef def_def
+#define yychk def_chk
+#define yypgo def_pgo
+#define yyact def_act
#define yyexca def_exca
#define yyerrflag def_errflag
#define yynerrs def_nerrs
static void def_heapsize (int, int);
static void def_import (const char *, const char *, const char *, const char *,
int, const char *);
-static void def_image_name (const char *, int, int);
+static void def_image_name (const char *, bfd_vma, int);
static void def_section (const char *, int);
static void def_section_alt (const char *, const char *);
static void def_stacksize (int, int);
char *id;
const char *id_const;
int number;
+ bfd_vma vma;
char *digits;
};
%token <id> ID
%token <digits> DIGITS
%type <number> NUMBER
+%type <vma> VMA opt_base
%type <digits> opt_digits
-%type <number> opt_base opt_ordinal
+%type <number> opt_ordinal
%type <number> attr attr_list opt_number exp_opt_list exp_opt
%type <id> opt_name opt_name2 opt_equal_name anylang_id opt_id
%type <id> opt_equalequal_name
| command
;
-command:
+command:
NAME opt_name opt_base { def_image_name ($2, $3, 0); }
| LIBRARY opt_name opt_base { def_image_name ($2, $3, 1); }
| DESCRIPTION ID { def_description ($2);}
| CODE attr_list { def_section ("CODE", $2);}
| DATAU attr_list { def_section ("DATA", $2);}
| SECTIONS seclist
- | EXPORTS explist
+ | EXPORTS explist
| IMPORTS implist
| VERSIONK NUMBER { def_version ($2, 0);}
| VERSIONK NUMBER '.' NUMBER { def_version ($2, $4);}
| PRIVATEU { $$ = 8; }
| PRIVATEL { $$ = 8; }
;
-implist:
+implist:
implist impline
| impline
;
opt_comma:
','
- |
+ |
;
opt_number: ',' NUMBER { $$=$2;}
| { $$=-1;}
;
-
+
attr:
READ { $$ = 1;}
- | WRITE { $$ = 2;}
+ | WRITE { $$ = 2;}
| EXECUTE { $$=4;}
| SHARED { $$=8;}
;
| EXPORTS { $$ = "EXPORTS"; }
| HEAPSIZE { $$ = "HEAPSIZE"; }
| IMPORTS { $$ = "IMPORTS"; }
- | LIBRARY { $$ = "LIBRARY"; }
+/* Disable LIBRARY keyword as valid symbol-name. This is necessary
+ for libtool, which places this command after EXPORTS command.
+ This behavior is illegal by specification, but sadly required by
+ by compatibility reasons.
+ See PR binutils/13710
+ | LIBRARY { $$ = "LIBRARY"; } */
| NAME { $$ = "NAME"; }
| NONAMEU { $$ = "NONAME"; }
| NONAMEL { $$ = "noname"; }
$$ = name;
}
| '.' opt_name2
- {
+ {
char *name = def_pool_alloc (strlen ($2) + 2);
sprintf (name, ".%s", $2);
$$ = name;
}
| keyword_as_name '.' opt_name2
- {
+ {
char *name = def_pool_alloc (strlen ($1) + 1 + strlen ($3) + 1);
sprintf (name, "%s.%s", $1, $3);
$$ = name;
}
| ID '.' opt_name2
- {
+ {
char *name = def_pool_alloc (strlen ($1) + 1 + strlen ($3) + 1);
sprintf (name, "%s.%s", $1, $3);
$$ = name;
| { $$ = 0; }
;
-opt_ordinal:
+opt_ordinal:
'@' NUMBER { $$ = $2;}
| { $$ = -1;}
;
opt_equal_name:
'=' opt_name2 { $$ = $2; }
- | { $$ = 0; }
+ | { $$ = 0; }
;
-opt_base: BASE '=' NUMBER { $$ = $3;}
- | { $$ = -1;}
+opt_base: BASE '=' VMA { $$ = $3;}
+ | { $$ = (bfd_vma) -1;}
;
anylang_id: ID { $$ = $1; }
;
NUMBER: DIGITS { $$ = strtoul ($1, 0, 0); }
+ ;
+VMA: DIGITS { $$ = (bfd_vma) strtoull ($1, 0, 0); }
%%
if (fdef->is_dll != -1)
fprintf (file, " is dll: %s\n", fdef->is_dll ? "yes" : "no");
if (fdef->base_address != (bfd_vma) -1)
- fprintf (file, " base address: 0x%08x\n", fdef->base_address);
+ {
+ fprintf (file, " base address: 0x");
+ fprintf_vma (file, fdef->base_address);
+ fprintf (file, "\n");
+ }
if (fdef->description)
fprintf (file, " description: `%s'\n", fdef->description);
if (fdef->stack_reserve != -1)
if (!diropts[i].param)
{
- char saved;
+ if (tend < pend)
+ {
+ char saved;
- saved = * tend;
- * tend = 0;
- /* xgettext:c-format */
- einfo (_("Warning: .drectve `%s' unrecognized\n"), param);
- * tend = saved;
+ saved = * tend;
+ * tend = 0;
+ /* xgettext:c-format */
+ einfo (_("Warning: .drectve `%s' unrecognized\n"), param);
+ * tend = saved;
+ }
+ else
+ {
+ einfo (_("Warning: corrupt .drectve at end of def file\n"));
+ }
}
lex_parse_string = 0;
/* Parser Callbacks. */
static void
-def_image_name (const char *name, int base, int is_dll)
+def_image_name (const char *name, bfd_vma base, int is_dll)
{
/* If a LIBRARY or NAME statement is specified without a name, there is nothing
to do here. We retain the output filename specified on command line. */
name);
if (def->name)
free (def->name);
- /* Append the default suffix, if none specified. */
+ /* Append the default suffix, if none specified. */
if (strchr (image_name, '.') == 0)
{
const char * suffix = is_dll ? ".dll" : ".exe";
char *buf = 0;
const char *ext = dllext ? dllext : "dll";
int is_dup = 0;
-
+
buf = xmalloc (strlen (module) + strlen (ext) + 2);
sprintf (buf, "%s.%s", module, ext);
module = buf;
def_aligncomm (char *str, int align)
{
def_file_aligncomm *c, *p;
-
+
p = NULL;
c = def->aligncomms;
while (c != NULL)