Honour the PRIVATE keyword
authorNick Clifton <nickc@redhat.com>
Mon, 8 Mar 2004 11:50:36 +0000 (11:50 +0000)
committerNick Clifton <nickc@redhat.com>
Mon, 8 Mar 2004 11:50:36 +0000 (11:50 +0000)
binutils/ChangeLog
binutils/deflex.l
binutils/defparse.y
binutils/dlltool.c
binutils/dlltool.h

index 0b913773bebbdcd6577923d96cb6451008a5af3e..e1ac906192becd4fb90021043ae6f6552bc5c69e 100644 (file)
@@ -1,3 +1,23 @@
+2004-03-08  Danny Smith  <dannysmith@users.sourceforge.net>
+
+       * 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  <schwab@suse.de>
 
        * ar.c (main): Support POSIX-compatible argument parsing.
index 106cc7bf155ff4a73e17ad6a4e6d50ec8a5b90fc..bdf15d3a12efc84c23b22448ef26e6d35bd77b80 100644 (file)
@@ -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;}
index d0bccd95a70631f470bc8453f470246c0e810d11..b58aaee7146d17ece1e04de25a19fdc87810889b 100644 (file)
@@ -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> ID
 %token <number> NUMBER
-%type  <number> opt_base opt_ordinal opt_NONAME opt_CONSTANT opt_DATA
+%type  <number> opt_base opt_ordinal opt_NONAME opt_CONSTANT opt_DATA opt_PRIVATE
 %type  <number> attr attr_list opt_number
 %type  <id> 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     
          { 
index 02b71d34def76a776b189c2c6072935f5020ab8e..5f921ae0954b4fcd7f1689cd1745308766c494a1 100644 (file)
@@ -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  ( (  ( <name1> [ = <name2> ] )
                | ( <name1> = <module-name> . <external-name>))
-            [ @ <integer> ] [ NONAME ] [CONSTANT] [DATA] ) *
+            [ @ <integer> ] [ NONAME ] [CONSTANT] [DATA] [PRIVATE] ) *
    Declares name1 as an exported symbol from the
    DLL, with optional ordinal number <integer>.
    Or declares name1 as an alias (forward) of the function <external-name>
@@ -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':
index c2eaea6fdea156b97a0f7f71bfd34be45eccbbbe..f488d96c02da35cf1df822883f71ebb97375b4c9 100644 (file)
@@ -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;