X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=ld%2Fdeffilep.y;h=5f02727bdf6a9395930f77acb43b2e3e8db521b0;hb=c1711530e652a14bc0df9b603c73e350b5dfe5ec;hp=aa09136d147672c945cc55ccaf036bf8ed02f26f;hpb=aef6203bd6d412d65f539a41f1abd07b14d7a05d;p=deliverable%2Fbinutils-gdb.git diff --git a/ld/deffilep.y b/ld/deffilep.y index aa09136d14..5f02727bdf 100644 --- a/ld/deffilep.y +++ b/ld/deffilep.y @@ -1,13 +1,13 @@ %{ /* deffilep.y - parser for .def files */ -/* Copyright 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005 +/* Copyright 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2007 Free Software Foundation, Inc. This file is part of GNU Binutils. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -17,13 +17,13 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ -#include +#include "sysdep.h" #include "libiberty.h" #include "safe-ctype.h" #include "bfd.h" -#include "sysdep.h" #include "ld.h" #include "ldmisc.h" #include "deffile.h" @@ -89,6 +89,7 @@ static void def_section_alt (const char *, const char *); static void def_stacksize (int, int); static void def_version (int, int); static void def_directive (char *); +static void def_aligncomm (char *str, int align); static int def_parse (void); static int def_error (const char *); static int def_lex (void); @@ -104,9 +105,9 @@ static const char *lex_parse_string_end = 0; int number; }; -%token NAME LIBRARY DESCRIPTION STACKSIZE HEAPSIZE CODE DATAU DATAL +%token NAME LIBRARY DESCRIPTION STACKSIZE_K HEAPSIZE CODE DATAU DATAL %token SECTIONS EXPORTS IMPORTS VERSIONK BASE CONSTANTU CONSTANTL -%token PRIVATEU PRIVATEL +%token PRIVATEU PRIVATEL ALIGNCOMM %token READ WRITE EXECUTE SHARED NONAMEU NONAMEL DIRECTIVE %token ID %token NUMBER @@ -124,7 +125,7 @@ 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);} - | STACKSIZE NUMBER opt_number { def_stacksize ($2, $3);} + | STACKSIZE_K NUMBER opt_number { def_stacksize ($2, $3);} | HEAPSIZE NUMBER opt_number { def_heapsize ($2, $3);} | CODE attr_list { def_section ("CODE", $2);} | DATAU attr_list { def_section ("DATA", $2);} @@ -134,6 +135,7 @@ command: | VERSIONK NUMBER { def_version ($2, 0);} | VERSIONK NUMBER '.' NUMBER { def_version ($2, $4);} | DIRECTIVE ID { def_directive ($2);} + | ALIGNCOMM ID ',' NUMBER { def_aligncomm ($2, $4);} ; @@ -379,6 +381,14 @@ def_file_free (def_file *def) free (m); } + while (def->aligncomms) + { + def_file_aligncomm *c = def->aligncomms; + def->aligncomms = def->aligncomms->next; + free (c->symbol_name); + free (c); + } + free (def); } @@ -570,9 +580,10 @@ struct diropts[] = { { "-heap", HEAPSIZE }, - { "-stack", STACKSIZE }, + { "-stack", STACKSIZE_K }, { "-attr", SECTIONS }, { "-export", EXPORTS }, + { "-aligncomm", ALIGNCOMM }, { 0, 0 } }; @@ -648,13 +659,30 @@ def_file_add_directive (def_file *my_def, const char *param, int len) static void def_image_name (const char *name, int base, int is_dll) { - const char* image_name = lbasename (name); - if (image_name != name) - einfo ("%s:%d: Warning: path components stripped from %s, '%s'\n", - def_filename, linenumber, is_dll ? "LIBRARY" : "NAME", name); - if (def->name) - free (def->name); - def->name = xstrdup (image_name); + /* 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. */ + if (*name) + { + const char* image_name = lbasename (name); + if (image_name != name) + einfo ("%s:%d: Warning: path components stripped from %s, '%s'\n", + def_filename, linenumber, is_dll ? "LIBRARY" : "NAME", + name); + if (def->name) + free (def->name); + /* Append the default suffix, if none specified. */ + if (strchr (image_name, '.') == 0) + { + const char * suffix = is_dll ? ".dll" : ".exe"; + + def->name = xmalloc (strlen (image_name) + strlen (suffix) + 1); + sprintf (def->name, "%s%s", image_name, suffix); + } + else + def->name = xstrdup (image_name); + } + + /* Honor a BASE address statement, even if LIBRARY string is empty. */ def->base_address = base; def->is_dll = is_dll; } @@ -814,6 +842,18 @@ def_directive (char *str) d->len = strlen (str); } +static void +def_aligncomm (char *str, int align) +{ + def_file_aligncomm *c = xmalloc (sizeof (def_file_aligncomm)); + + c->symbol_name = xstrdup (str); + c->alignment = (unsigned int) align; + + c->next = def->aligncomms; + def->aligncomms = c; +} + static int def_error (const char *err) { @@ -877,7 +917,7 @@ tokens[] = { "SECTIONS", SECTIONS }, { "SEGMENTS", SECTIONS }, { "SHARED", SHARED }, - { "STACKSIZE", STACKSIZE }, + { "STACKSIZE", STACKSIZE_K }, { "VERSION", VERSIONK }, { "WRITE", WRITE }, { 0, 0 }