Mailing-List: contact cygwin-apps-help AT sourceware DOT cygnus DOT com; run by ezmlm Sender: cygwin-apps-owner AT sourceware DOT cygnus DOT com List-Subscribe: List-Archive: List-Post: List-Help: , Delivered-To: mailing list cygwin-apps AT sources DOT redhat DOT com Message-ID: <0a9301c17269$075c5a30$0200a8c0@lifelesswks> From: "Robert Collins" To: "Danny Smith" , "cygwin-apps" , "mingw-dvlpr" References: <20011121084158 DOT 22945 DOT qmail AT web14501 DOT mail DOT yahoo DOT com> Subject: Re: ld ---export--all --exclude-libs,? Date: Wed, 21 Nov 2001 19:46:35 +1100 MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2600.0000 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2600.0000 X-OriginalArrivalTime: 21 Nov 2001 08:46:30.0956 (UTC) FILETIME=[042216C0:01C17269] IIRC the reason the auto-export feature didn't automatically prevent forwarded exports was we didn't know how. I had a quick look at doing that when I tweaked Paul's work to also exlude the cygwin common symbols. If you've found how to detect forward exports coming from other libraries, then _please_ make excluding those the default. In fact IMO such symbols should require explicit source code decoration -say via the .def file- to create as AFAIK there is no ELF equivalent to a forwarded symbol. Rob === ----- Original Message ----- From: "Danny Smith" To: "cygwin-apps" ; "mingw-dvlpr" Sent: Wednesday, November 21, 2001 7:41 PM Subject: ld ---export--all --exclude-libs,? > Hello, I'm after some criticism, before submitting this to binutils. > > IMO, the auto-export feature of ld needs (at least) an option to exclude > whole libs from export. The following patch does that. It also adds a few > more default lib excludes and scans for backward compat implib symbols > (__imp_) > > I think this patch doesn't do enough. > > My preference would be to exclude *all* libs by default, with a command > line option to explicity *include* named libs. Why? It is too easy for > licensed library code to sneak into dll's using --export-all. This affects > distributability (sic) of the dll and apps dependent on the dll. > The user may be unaware of this infection because its automatic. > At least make the user think about what she/he is exporting. > > I will gladly throw away the following to work on a patch to exclude all > libs by default if given encouragement. > > Any comments. > > > 2001-11-21 Danny Smith > > * ld/emultempl/pe.em (OPTION_EXCLUDE_LIBS): Add new define. > (longopts): Add new option --exclude-libs. > (gld_${EMULATION_NAME}_list_options): Document it. > (gld_${EMULATION_NAME}_parse_args): Use it. > * ld/pe-dll.h (pe_dll_add_excludes): Add second param to prototype. > * ld/pe-dll.c (autofilter_liblist): Add more default libs. > (exclude_list_struct): Add field type to distinguish > symbols from whole archives. > (pe_dll_add_excludes): Set excludes->type. > (auto_export): Scan for old __imp_ prefix as well as _imp__ > when filtering symbols. Add new variable libname and set to > archive basename if abfd. Use it when filtering default and > user-specified libarary excludes. Use excludes->type when > scanning user-specified excludes. > > Index: src/ld/pe-dll.c > =================================================================== > RCS file: /cvs/src/src/ld/pe-dll.c,v > retrieving revision 1.37 > diff -u -p -r1.37 pe-dll.c > --- pe-dll.c 2001/10/19 14:25:51 1.37 > +++ pe-dll.c 2001/11/21 08:20:19 > @@ -231,6 +231,9 @@ static autofilter_entry_type autofilter_ > { "libgcc.", 7 }, > { "libstdc++.", 10 }, > { "libmingw32.", 11 }, > + { "libg2c.", 7 }, > + { "libsupc++.", 10 }, /* g++ 3.x */ > + { "libobjc.", 8 }, > { NULL, 0 } > }; > > @@ -368,14 +371,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 +396,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 +404,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,9 +417,13 @@ 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) > + if ((strncmp (n, "_imp__", 6) == 0) > + || (strncmp (n, "__imp_", 6) == 0)) > return 0; > > for (i = 0; i < d->num_exports; i++) > @@ -429,14 +440,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 +506,15 @@ auto_export (abfd, d, n) > } > > for (ex = excludes; ex; ex = ex->next) > - if (strcmp (n, ex->string) == 0) > - return 0; > + { > + if (ex->type == 1) > + { > + if (libname && (strcmp (libname, ex->string) == 0)) > + return 0; > + } > + else if (strcmp (n, ex->string) == 0) > + return 0; > + } > > return 1; > } > Index: src/ld/pe-dll.h > =================================================================== > RCS file: /cvs/src/src/ld/pe-dll.h,v > retrieving revision 1.5 > diff -u -p -r1.5 pe-dll.h > --- pe-dll.h 2001/09/12 15:58:10 1.5 > +++ pe-dll.h 2001/11/21 08:20:19 > @@ -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 > *)); > Index: src/ld/emultempl/pe.em > =================================================================== > RCS file: /cvs/src/src/ld/emultempl/pe.em,v > retrieving revision 1.54 > diff -u -p -r1.54 pe.em > --- pe.em 2001/09/24 18:21:24 1.54 > +++ pe.em 2001/11/21 08:20:30 > @@ -221,7 +221,9 @@ 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 */ > {"base-file", required_argument, NULL, OPTION_BASE_FILE}, > @@ -247,6 +249,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 +336,7 @@ gld_${EMULATION_NAME}_list_options (file > fprintf (file, _(" --disable-stdcall-fixup Don't link _sym > to _sym AT nn\n")); > fprintf (file, _(" --enable-stdcall-fixup Link _sym to > _sym AT 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 Generate import > library\n")); > @@ -586,7 +590,10 @@ gld_${EMULATION_NAME}_parse_args(argc, a > 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; > > > > http://shopping.yahoo.com.au - Yahoo! Shopping > - Get organised for Christmas early this year! >