From 7aa52b1f6540662befbe35a8dd7ffb6b040d9231 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Mon, 8 Mar 2004 11:50:36 +0000 Subject: [PATCH] Honour the PRIVATE keyword --- binutils/ChangeLog | 20 ++++++++++++++++ binutils/deflex.l | 32 ++++++++++++------------- binutils/defparse.y | 40 +++++++++++++++++-------------- binutils/dlltool.c | 68 ++++++++++++++++++++++++++--------------------------- binutils/dlltool.h | 11 +++++---- 5 files changed, 98 insertions(+), 73 deletions(-) diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 0b91377..e1ac906 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,23 @@ +2004-03-08 Danny Smith + + * deflex.l: Handle "PRIVATE" string. + * defparse.y (%token): Add PRIVATE. + (%type): Add opt_PRIVATE. + (expline): Pass opt_PRIVATE to def_exports. + (opt_PRIVATE): Handle PRIVATE token. + * dlltool.h (def_exports): Add 7th param for private flag to + declaration. + * dlltool.c: Add PRIVATE to comment on EXPORTS syntax. + (struct export): Add 'private' field. + (def_exports): Set 'private' field of struct exports. + (scan_drectve_symbols): Adjust calls to def_exports. + (scan_filtered_symbols): Likewise. + (dump_def_info): Print 'private' field. + (gen_def_file): Likewise. + (gen_lib_file): Skip generation of lib object if private. + Delete tmp object files in same order as they were generated. + Don't delete non-existent private object files. + 2004-02-27 Andreas Schwab * ar.c (main): Support POSIX-compatible argument parsing. diff --git a/binutils/deflex.l b/binutils/deflex.l index 106cc7b..bdf15d3 100644 --- a/binutils/deflex.l +++ b/binutils/deflex.l @@ -1,28 +1,27 @@ %{/* deflex.l - Lexer for .def files */ -/* Copyright 1995, 1997, 1998, 1999, 2002, 2003 Free Software Foundation, Inc. +/* Copyright 1995, 1997, 1998, 1999, 2002, 2003, 2004 + Free Software Foundation, Inc. -This file is part of GNU Binutils. + 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 -(at your option) any later version. + 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 + (at your option) any later version. -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. -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. */ + 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. */ -/* Contributed by Steve Chamberlain - sac@cygnus.com +/* Contributed by Steve Chamberlain: sac@cygnus.com */ -*/ #define DONTDECLARE_MALLOC #include "libiberty.h" #include "defparse.h" @@ -46,6 +45,7 @@ int linenumber; "BASE" { return BASE;} "CONSTANT" { return CONSTANT; } "NONAME" { return NONAME; } +"PRIVATE" { return PRIVATE; } "READ" { return READ;} "WRITE" { return WRITE;} "EXECUTE" { return EXECUTE;} diff --git a/binutils/defparse.y b/binutils/defparse.y index d0bccd9..b58aaee 100644 --- a/binutils/defparse.y +++ b/binutils/defparse.y @@ -1,22 +1,23 @@ %{ /* defparse.y - parser for .def files */ -/* Copyright 1995, 1997, 1998, 1999 Free Software Foundation, Inc. +/* Copyright 1995, 1997, 1998, 1999, 2004 + Free Software Foundation, Inc. -This file is part of GNU Binutils. + 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 -(at your option) any later version. + 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 + (at your option) any later version. -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. -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. */ + 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. */ #include "bfd.h" #include "bucomm.h" @@ -30,11 +31,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ %token NAME, LIBRARY, DESCRIPTION, STACKSIZE, HEAPSIZE, CODE, DATA %token SECTIONS, EXPORTS, IMPORTS, VERSIONK, BASE, CONSTANT -%token READ WRITE EXECUTE SHARED NONSHARED NONAME +%token READ WRITE EXECUTE SHARED NONSHARED NONAME PRIVATE %token SINGLE MULTIPLE INITINSTANCE INITGLOBAL TERMINSTANCE TERMGLOBAL %token ID %token NUMBER -%type opt_base opt_ordinal opt_NONAME opt_CONSTANT opt_DATA +%type opt_base opt_ordinal opt_NONAME opt_CONSTANT opt_DATA opt_PRIVATE %type attr attr_list opt_number %type opt_name opt_equal_name @@ -66,8 +67,8 @@ explist: ; expline: - ID opt_equal_name opt_ordinal opt_NONAME opt_CONSTANT opt_DATA - { def_exports ($1, $2, $3, $4, $5, $6);} + ID opt_equal_name opt_ordinal opt_NONAME opt_CONSTANT opt_DATA opt_PRIVATE + { def_exports ($1, $2, $3, $4, $5, $6, $7);} ; implist: implist impline @@ -132,6 +133,11 @@ opt_DATA: | { $$ = 0; } ; +opt_PRIVATE: + PRIVATE { $$ = 1; } + | { $$ = 0; } + ; + opt_name: ID { $$ =$1; } | ID '.' ID { diff --git a/binutils/dlltool.c b/binutils/dlltool.c index 02b71d3..5f921ae 100644 --- a/binutils/dlltool.c +++ b/binutils/dlltool.c @@ -1,5 +1,5 @@ /* dlltool.c -- tool to generate stuff for PE style DLLs - Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 + Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. This file is part of GNU Binutils. @@ -49,7 +49,7 @@ EXPORTS ( ( ( [ = ] ) | ( = . )) - [ @ ] [ NONAME ] [CONSTANT] [DATA] ) * + [ @ ] [ NONAME ] [CONSTANT] [DATA] [PRIVATE] ) * Declares name1 as an exported symbol from the DLL, with optional ordinal number . Or declares name1 as an alias (forward) of the function @@ -643,7 +643,8 @@ typedef struct export const char *internal_name; int ordinal; int constant; - int noname; + int noname; /* Don't put name in image file. */ + int private; /* Don't put reference in import lib. */ int data; int hint; int forward; /* Number of forward label, 0 means no forward. */ @@ -889,7 +890,7 @@ yyerror (const char * err ATTRIBUTE_UNUSED) void def_exports (const char *name, const char *internal_name, int ordinal, - int noname, int constant, int data) + int noname, int constant, int data, int private) { struct export *p = (struct export *) xmalloc (sizeof (*p)); @@ -898,6 +899,7 @@ def_exports (const char *name, const char *internal_name, int ordinal, p->ordinal = ordinal; p->constant = constant; p->noname = noname; + p->private = private; p->data = data; p->next = d_exports; d_exports = p; @@ -1246,7 +1248,7 @@ scan_drectve_symbols (bfd *abfd) /* FIXME: The 5th arg is for the `constant' field. What should it be? Not that it matters since it's not currently useful. */ - def_exports (c, 0, -1, 0, 0, ! (flags & BSF_FUNCTION)); + def_exports (c, 0, -1, 0, 0, ! (flags & BSF_FUNCTION), 0); if (add_stdcall_alias && strchr (c, '@')) { @@ -1255,7 +1257,7 @@ scan_drectve_symbols (bfd *abfd) char *atsym = strchr (exported_name, '@'); *atsym = '\0'; /* Note: stdcall alias symbols can never be data. */ - def_exports (exported_name, xstrdup (c), -1, 0, 0, 0); + def_exports (exported_name, xstrdup (c), -1, 0, 0, 0, 0); } } else @@ -1294,7 +1296,7 @@ scan_filtered_symbols (bfd *abfd, void *minisyms, long symcount, ++symbol_name; def_exports (xstrdup (symbol_name) , 0, -1, 0, 0, - ! (sym->flags & BSF_FUNCTION)); + ! (sym->flags & BSF_FUNCTION), 0); if (add_stdcall_alias && strchr (symbol_name, '@')) { @@ -1303,7 +1305,7 @@ scan_filtered_symbols (bfd *abfd, void *minisyms, long symcount, char *atsym = strchr (exported_name, '@'); *atsym = '\0'; /* Note: stdcall alias symbols can never be data. */ - def_exports (exported_name, xstrdup (symbol_name), -1, 0, 0, 0); + def_exports (exported_name, xstrdup (symbol_name), -1, 0, 0, 0, 0); } } } @@ -1518,13 +1520,14 @@ dump_def_info (FILE *f) fprintf (f, "\n"); for (i = 0, exp = d_exports; exp; i++, exp = exp->next) { - fprintf (f, "%s %d = %s %s @ %d %s%s%s\n", + fprintf (f, "%s %d = %s %s @ %d %s%s%s%s\n", ASM_C, i, exp->name, exp->internal_name, exp->ordinal, exp->noname ? "NONAME " : "", + exp->private ? "PRIVATE " : "", exp->constant ? "CONSTANT" : "", exp->data ? "DATA" : ""); } @@ -1595,20 +1598,20 @@ gen_def_file (void) if (strcmp (exp->name, exp->internal_name) == 0) { - - fprintf (output_def, "\t%s%s%s @ %d%s%s\n", + fprintf (output_def, "\t%s%s%s @ %d%s%s%s\n", quote, exp->name, quote, exp->ordinal, exp->noname ? " NONAME" : "", + exp->private ? "PRIVATE " : "", exp->data ? " DATA" : ""); } else { - char *quote1 = strchr (exp->internal_name, '.') ? "\"" : ""; + char * quote1 = strchr (exp->internal_name, '.') ? "\"" : ""; /* char *alias = */ - fprintf (output_def, "\t%s%s%s = %s%s%s @ %d%s%s\n", + fprintf (output_def, "\t%s%s%s = %s%s%s @ %d%s%s%s\n", quote, exp->name, quote, @@ -1617,6 +1620,7 @@ gen_def_file (void) quote1, exp->ordinal, exp->noname ? " NONAME" : "", + exp->private ? "PRIVATE " : "", exp->data ? " DATA" : ""); } } @@ -2794,7 +2798,11 @@ gen_lib_file (void) for (i = 0; (exp = d_exports_lexically[i]); i++) { - bfd *n = make_one_lib_file (exp, i); + bfd *n; + /* Don't add PRIVATE entries to import lib. */ + if (exp->private) + continue; + n = make_one_lib_file (exp, i); n->next = head; head = n; } @@ -2831,8 +2839,11 @@ gen_lib_file (void) char *name; name = (char *) alloca (strlen (TMP_STUB) + 10); - for (i = 0, exp = d_exports; exp; i++, exp = exp->next) + for (i = 0; (exp = d_exports_lexically[i]); i++) { + /* Don't delete non-existent stubs for PRIVATE entries. */ + if (exp->private) + continue; sprintf (name, "%s%05d.o", TMP_STUB, i); if (unlink (name) < 0) /* xgettext:c-format */ @@ -2843,10 +2854,9 @@ gen_lib_file (void) inform (_("Created lib file")); } -/**********************************************************************/ - /* Run through the information gathered from the .o files and the .def file and work out the best stuff. */ + static int pfunc (const void *a, const void *b) { @@ -2890,11 +2900,7 @@ remove_null_names (export_type **ptr) } static void -dtab (export_type **ptr -#ifndef SACDEBUG -ATTRIBUTE_UNUSED -#endif - ) +dtab (export_type **ptr ATTRIBUTE_UNUSED) { #ifdef SACDEBUG int i; @@ -2922,7 +2928,6 @@ process_duplicates (export_type **d_export_vec) while (more) { - more = 0; /* Remove duplicates. */ qsort (d_export_vec, d_nfuncs, sizeof (export_type *), nfunc); @@ -2933,7 +2938,6 @@ process_duplicates (export_type **d_export_vec) if (strcmp (d_export_vec[i]->name, d_export_vec[i + 1]->name) == 0) { - export_type *a = d_export_vec[i]; export_type *b = d_export_vec[i + 1]; @@ -2963,13 +2967,10 @@ process_duplicates (export_type **d_export_vec) } } - /* Count the names. */ for (i = 0; i < d_nfuncs; i++) - { - if (!d_export_vec[i]->noname) - d_named_nfuncs++; - } + if (!d_export_vec[i]->noname) + d_named_nfuncs++; } static void @@ -3008,7 +3009,7 @@ fill_ordinals (export_type **d_export_vec) { if (d_export_vec[i]->ordinal == -1) { - register int j; + int j; /* First try within or after any user supplied range. */ for (j = lowest; j < size; j++) @@ -3063,8 +3064,7 @@ mangle_defs (void) int i; int hint = 0; - export_type **d_export_vec - = (export_type **) xmalloc (sizeof (export_type *) * d_nfuncs); + export_type **d_export_vec = xmalloc (sizeof (export_type *) * d_nfuncs); inform (_("Processing definitions")); @@ -3101,8 +3101,6 @@ mangle_defs (void) inform (_("Processed definitions")); } -/**********************************************************************/ - static void usage (FILE *file, int status) { @@ -3239,7 +3237,7 @@ main (int ac, char **av) as_flags = optarg; break; - /* ignored for compatibility */ + /* Ignored for compatibility. */ case 'u': break; case 'a': diff --git a/binutils/dlltool.h b/binutils/dlltool.h index c2eaea6..f488d96 100644 --- a/binutils/dlltool.h +++ b/binutils/dlltool.h @@ -1,5 +1,5 @@ /* dlltool.h -- header file for dlltool - Copyright 1997, 1998, 2003 Free Software Foundation, Inc. + Copyright 1997, 1998, 2003, 2004 Free Software Foundation, Inc. This file is part of GNU Binutils. @@ -24,7 +24,7 @@ extern void def_code (int); extern void def_data (int); extern void def_description (const char *); -extern void def_exports (const char *, const char *, int, int, int, int); +extern void def_exports (const char *, const char *, int, int, int, int, int); extern void def_heapsize (int, int); extern void def_import (const char *, const char *, const char *, const char *, int); @@ -33,9 +33,10 @@ extern void def_name (const char *, int); extern void def_section (const char *, int); extern void def_stacksize (int, int); extern void def_version (int, int); -extern int yyparse (void); -extern int yyerror (const char *); +extern int yyparse (void); +extern int yyerror (const char *); +extern int yylex (void); + extern int yydebug; -extern int yylex (void); extern FILE *yyin; extern int linenumber; -- 2.7.4