Mail Archives: cygwin-apps/2002/04/27/03:48:52
--0-1994445467-1019893690=:50148
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit
Content-Disposition: inline
The auto-export feature of ld for pe-dll targets would be more flexible
with an option to exclude whole archive libs from export.
Here is an example:
test.c==================================================
/* test.c */
#include <libiberty.h> /* for lbasename */
__attribute__((dllexport)) void
dll_test (void)
{
printf("%s\n", lbasename ("./test.c"));
};
test.c==================================================
This command:
gcc -shared -o test.dll test.c -Wl,--export-all -liberty
currently produces a dll that exports these symbols:
dll_test
lbasename ; from libiberty.a
_sch_istable ; from libiberty.a
_sch_tolower ; from libiberty.a
_sch_toupper ; from libiberty.a
The following patch allows exclusion of specified libs or all libs.
So that:
gcc -shared -o test.dll test.c -Wl,--export-all,
-Wl,--exclude-libs,libiberty.a \
-liberty
exports only dll_test.
-Wl,--exclude-libs,ALL
would do the same.
Explicitly listing exports in .def file will override the --exclude-lib switch,
eg
test.def==============================================
;test.def
EXPORTS
lbasename
test.def=============================================
gcc -shared -o test.dll test.c test.def -Wl,--export-all,
-Wl,--exclude-libs,libiberty.a \
-liberty
exports:
dll_test
lbasename
The patch also adds a few more default system lib excludes. I haven't tried
-shared with Ada runtime libs. libgnat.a maybe another one that should be
excluded by default.
2002-04-27 Danny Smith <dannysmith AT users DOT sourceforge DOT 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.
* pe-dll.c (autofilter_liblist): Add more libs excluded by
default.
Diff file is attached. There are some long lines in pe.em
(gld_${EMULATION_NAME}_list_options) that may get wrapped.
Danny
http://messenger.yahoo.com.au - Yahoo! Messenger
- A great way to communicate long-distance for FREE!
--0-1994445467-1019893690=:50148
Content-Type: text/plain; name="pe-dll-auto-export.diff"
Content-Description: pe-dll-auto-export.diff
Content-Disposition: inline; filename="pe-dll-auto-export.diff"
Index: ld.texinfo
===================================================================
RCS file: /cvs/src/src/ld/ld.texinfo,v
retrieving revision 1.67
diff -u -p -r1.67 ld.texinfo
--- ld.texinfo 8 Apr 2002 00:24:02 -0000 1.67
+++ ld.texinfo 27 Apr 2002 07:32:23 -0000
@@ -1656,6 +1656,14 @@ These cygwin-excludes are: @code{_cygwin
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: pe-dll.c
===================================================================
RCS file: /cvs/src/src/ld/pe-dll.c,v
retrieving revision 1.38
diff -u -p -r1.38 pe-dll.c
--- pe-dll.c 15 Feb 2002 02:11:05 -0000 1.38
+++ pe-dll.c 27 Apr 2002 07:32:29 -0000
@@ -231,6 +231,9 @@ static autofilter_entry_type autofilter_
{ "libgcc.", 7 },
{ "libstdc++.", 10 },
{ "libmingw32.", 11 },
+ { "libg2c.", 7 },
+ { "libsupc++.", 10 },
+ { "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,12 @@ 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)
return 0;
for (i = 0; i < d->num_exports; i++)
@@ -429,14 +439,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 +505,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)
+ || (stricmp ("ALL", ex->string) == 0)))
+ return 0;
+ }
+ else if (strcmp (n, ex->string) == 0)
+ return 0;
+ }
return 1;
}
Index: 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 12 Sep 2001 15:58:10 -0000 1.5
+++ pe-dll.h 27 Apr 2002 07:32:29 -0000
@@ -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: emultempl/pe.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/pe.em,v
retrieving revision 1.59
diff -u -p -r1.59 pe.em
--- emultempl/pe.em 15 Feb 2002 02:11:05 -0000 1.59
+++ emultempl/pe.em 27 Apr 2002 07:32:35 -0000
@@ -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 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 <file> Generate import library\n"));
@@ -586,7 +589,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;
--0-1994445467-1019893690=:50148--
- Raw text -