OSDN Git Service

* pe-dll.c (autofilter_liblist): Add more system libs excluded by default.
authorcgf <cgf>
Wed, 22 May 2002 18:03:05 +0000 (18:03 +0000)
committercgf <cgf>
Wed, 22 May 2002 18:03:05 +0000 (18:03 +0000)
(autofilter_objlist): Add crtbegin.o, crtend.o.
* emultempl/pe.em (OPTION_EXCLUDE_LIBS): Add new define.
(longopts): Add new option --exclude-libs.
(gld_${EMULATION_NAME}_list_options): Give quick help about it.
(gld_${EMULATION_NAME}_parse_args): Use it.
* pe-dll.h (pe_dll_add_excludes): Add second param to prototype.
* pe-dll.c (exclude_list_struct): Add field type to distinguish symbols from
whole archives.
(pe_dll_add_excludes): Set excludes->type.
(auto_export): Add new variable libname and set to archive basename if abfd.
Use it when filtering default and user-specified libarary excludes.  Let string
"ALL" mean all libs when filtering user-specified libs.
* ld.texinfo: Document --exclude-libs.

ld/ChangeLog
ld/emultempl/pe.em
ld/ld.texinfo
ld/pe-dll.c
ld/pe-dll.h

index c6dc6fe..ae08f26 100644 (file)
@@ -1,3 +1,25 @@
+2002-05-21  Danny Smith  <dannysmith@users.sourceforge.net>
+
+       * pe-dll.c (autofilter_liblist): Add more system libs excluded by
+       default.
+       (autofilter_objlist): Add crtbegin.o, crtend.o.
+
+2002-05-21  Danny Smith  <dannysmith@users.sourceforge.net>
+
+       * emultempl/pe.em (OPTION_EXCLUDE_LIBS): Add new define.
+       (longopts): Add new option --exclude-libs.
+       (gld_${EMULATION_NAME}_list_options): Give quick help about it.
+       (gld_${EMULATION_NAME}_parse_args): Use it.
+       * pe-dll.h (pe_dll_add_excludes): Add second param to prototype.
+       * pe-dll.c (exclude_list_struct): Add field type to distinguish symbols
+       from whole archives.
+       (pe_dll_add_excludes): Set excludes->type.
+       (auto_export): Add new variable libname and set to archive basename if
+       abfd.  Use it when filtering default and user-specified libarary
+       excludes.  Let string "ALL" mean all libs when filtering user-specified
+       libs.
+       * ld.texinfo: Document --exclude-libs.
+
 2002-05-22  Alan Modra  <amodra@bigpond.net.au>
 
        * ldemul.c (ldemul_new_vers_pattern): New function.
index d9db9ae..ba5d83a 100644 (file)
@@ -221,6 +221,7 @@ gld_${EMULATION_NAME}_before_parse()
 #define OPTION_DLL_ENABLE_AUTO_IMPORT  (OPTION_NO_DEFAULT_EXCLUDES + 1)
 #define OPTION_DLL_DISABLE_AUTO_IMPORT (OPTION_DLL_ENABLE_AUTO_IMPORT + 1)
 #define OPTION_ENABLE_EXTRA_PE_DEBUG   (OPTION_DLL_DISABLE_AUTO_IMPORT + 1)
+#define OPTION_EXCLUDE_LIBS            (OPTION_ENABLE_EXTRA_PE_DEBUG + 1)
 
 static struct option longopts[] = {
   /* PE options */
@@ -247,6 +248,7 @@ static struct option longopts[] = {
   {"output-def", required_argument, NULL, OPTION_OUT_DEF},
   {"export-all-symbols", no_argument, NULL, OPTION_EXPORT_ALL},
   {"exclude-symbols", required_argument, NULL, OPTION_EXCLUDE_SYMBOLS},
+  {"exclude-libs", required_argument, NULL, OPTION_EXCLUDE_LIBS},      
   {"kill-at", no_argument, NULL, OPTION_KILL_ATS},
   {"add-stdcall-alias", no_argument, NULL, OPTION_STDCALL_ALIASES},
   {"enable-stdcall-fixup", no_argument, NULL, OPTION_ENABLE_STDCALL_FIXUP},
@@ -333,6 +335,7 @@ gld_${EMULATION_NAME}_list_options (file)
   fprintf (file, _("  --disable-stdcall-fixup            Don't link _sym to _sym@nn\n"));
   fprintf (file, _("  --enable-stdcall-fixup             Link _sym to _sym@nn without warnings\n"));
   fprintf (file, _("  --exclude-symbols sym,sym,...      Exclude symbols from automatic export\n"));
+  fprintf (file, _("  --exclude-libs lib,lib,...         Exclude libraries from automatic export\n")); 
   fprintf (file, _("  --export-all-symbols               Automatically export all globals to DLL\n"));
   fprintf (file, _("  --kill-at                          Remove @nn from exported symbols\n"));
   fprintf (file, _("  --out-implib <file>                Generate import library\n"));
@@ -586,7 +589,10 @@ gld_${EMULATION_NAME}_parse_args(argc, argv)
       pe_dll_export_everything = 1;
       break;
     case OPTION_EXCLUDE_SYMBOLS:
-      pe_dll_add_excludes (optarg);
+      pe_dll_add_excludes (optarg, 0);
+      break;
+    case OPTION_EXCLUDE_LIBS:
+      pe_dll_add_excludes (optarg, 1);
       break;
     case OPTION_KILL_ATS:
       pe_dll_kill_ats = 1;
index b7fa2a9..5eee540 100644 (file)
@@ -1665,6 +1665,14 @@ These cygwin-excludes are: @code{_cygwin_dll_entry@@12},
 Specifies a list of symbols which should not be automatically
 exported.  The symbol names may be delimited by commas or colons.
 
+@kindex --exclude-libs
+@item --exclude-libs @var{lib},@var{lib},...
+Specifies a list of archive libraries from which symbols should not be automatically
+exported. The library names may be delimited by commas or colons.  Specifying
+@code{--exclude-libs ALL} excludes symbols in all archive libraries from
+automatic export. Symbols explicitly listed in a .def file are still exported,
+regardless of this option. 
+
 @kindex --file-alignment
 @item --file-alignment
 Specify the file alignment.  Sections in the file will always begin at
index 51780c4..62c452c 100644 (file)
@@ -231,6 +231,9 @@ static autofilter_entry_type autofilter_liblist[] =
   { "libgcc.", 7 },
   { "libstdc++.", 10 },
   { "libmingw32.", 11 },
+  { "libg2c.", 7 },
+  { "libsupc++.", 10 },
+  { "libobjc.", 8 }, 
   { NULL, 0 }
 };
 
@@ -244,6 +247,8 @@ static autofilter_entry_type autofilter_objlist[] =
   { "gcrt0.o", 7 },
   { "gcrt1.o", 7 },
   { "gcrt2.o", 7 },
+  { "crtbegin.o", 10 },
+  { "crtend.o", 8 },
   { NULL, 0 }
 };
 
@@ -368,14 +373,16 @@ typedef struct exclude_list_struct
   {
     char *string;
     struct exclude_list_struct *next;
+    int type;  
   }
 exclude_list_struct;
 
 static struct exclude_list_struct *excludes = 0;
 
 void
-pe_dll_add_excludes (new_excludes)
+pe_dll_add_excludes (new_excludes, type)
      const char *new_excludes;
+     const int type;   
 {
   char *local_copy;
   char *exclude_string;
@@ -391,6 +398,7 @@ pe_dll_add_excludes (new_excludes)
                     xmalloc (sizeof (struct exclude_list_struct)));
       new_exclude->string = (char *) xmalloc (strlen (exclude_string) + 1);
       strcpy (new_exclude->string, exclude_string);
+      new_exclude->type = type;
       new_exclude->next = excludes;
       excludes = new_exclude;
     }
@@ -398,6 +406,7 @@ pe_dll_add_excludes (new_excludes)
   free (local_copy);
 }
 
+
 /* abfd is a bfd containing n (or NULL)
    It can be used for contextual checks.  */
 
@@ -410,6 +419,9 @@ auto_export (abfd, d, n)
   int i;
   struct exclude_list_struct *ex;
   autofilter_entry_type *afptr;
+  const char * libname = 0;
+  if (abfd && abfd->my_archive)
+    libname = lbasename (abfd->my_archive->filename);
 
   /* We should not re-export imported stuff.  */
   if (strncmp (n, "_imp__", 6) == 0)
@@ -429,14 +441,14 @@ auto_export (abfd, d, n)
                n, abfd, abfd->my_archive);
 
       /* First of all, make context checks:
-         Don't export anything from libgcc.  */
-      if (abfd && abfd->my_archive)
+         Don't export anything from standard libs.  */
+      if (libname)     
        {
          afptr = autofilter_liblist;
 
          while (afptr->name)
            {
-             if (strstr (abfd->my_archive->filename, afptr->name))
+             if (strncmp (libname, afptr->name, afptr->len) == 0 )
                return 0;
              afptr++;
            }
@@ -495,8 +507,17 @@ auto_export (abfd, d, n)
     }
 
   for (ex = excludes; ex; ex = ex->next)
-    if (strcmp (n, ex->string) == 0)
-      return 0;
+    {
+      if (ex->type == 1) /* exclude-libs */
+       {
+         if (libname
+             && ((strcmp (libname, ex->string) == 0)
+                  || (strcasecmp ("ALL", ex->string) == 0)))
+           return 0;
+       }
+      else if (strcmp (n, ex->string) == 0)
+        return 0;                      
+    }
 
   return 1;
 }
index f5e9324..b651f8d 100644 (file)
@@ -36,7 +36,7 @@ extern int pe_dll_compat_implib;
 extern int pe_dll_extra_pe_debug;
 
 extern void pe_dll_id_target PARAMS ((const char *));
-extern void pe_dll_add_excludes PARAMS ((const char *));
+extern void pe_dll_add_excludes PARAMS ((const char *, const int));
 extern void pe_dll_generate_def_file PARAMS ((const char *));
 extern void pe_dll_generate_implib PARAMS ((def_file *, const char *));
 extern void pe_process_import_defs PARAMS ((bfd *, struct bfd_link_info *));