diff options
-rw-r--r-- | ld/ChangeLog | 22 | ||||
-rw-r--r-- | ld/emultempl/pe.em | 8 | ||||
-rw-r--r-- | ld/ld.texinfo | 8 | ||||
-rw-r--r-- | ld/pe-dll.c | 33 | ||||
-rw-r--r-- | ld/pe-dll.h | 2 |
5 files changed, 65 insertions, 8 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog index c6dc6fe..ae08f26 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -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. diff --git a/ld/emultempl/pe.em b/ld/emultempl/pe.em index d9db9ae..ba5d83a 100644 --- a/ld/emultempl/pe.em +++ b/ld/emultempl/pe.em @@ -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; diff --git a/ld/ld.texinfo b/ld/ld.texinfo index b7fa2a9..5eee540 100644 --- a/ld/ld.texinfo +++ b/ld/ld.texinfo @@ -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 diff --git a/ld/pe-dll.c b/ld/pe-dll.c index 51780c4..62c452c 100644 --- a/ld/pe-dll.c +++ b/ld/pe-dll.c @@ -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; } diff --git a/ld/pe-dll.h b/ld/pe-dll.h index f5e9324..b651f8d 100644 --- a/ld/pe-dll.h +++ b/ld/pe-dll.h @@ -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 *)); |