* pe-dll.c (autofilter_liblist): Add more system libs excluded by default.
(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.
This commit is contained in:
parent
76feaaf359
commit
70b0be7903
22
ld/ChangeLog
22
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>
|
2002-05-22 Alan Modra <amodra@bigpond.net.au>
|
||||||
|
|
||||||
* ldemul.c (ldemul_new_vers_pattern): New function.
|
* ldemul.c (ldemul_new_vers_pattern): New function.
|
||||||
|
|
|
@ -221,6 +221,7 @@ gld_${EMULATION_NAME}_before_parse()
|
||||||
#define OPTION_DLL_ENABLE_AUTO_IMPORT (OPTION_NO_DEFAULT_EXCLUDES + 1)
|
#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_DLL_DISABLE_AUTO_IMPORT (OPTION_DLL_ENABLE_AUTO_IMPORT + 1)
|
||||||
#define OPTION_ENABLE_EXTRA_PE_DEBUG (OPTION_DLL_DISABLE_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[] = {
|
static struct option longopts[] = {
|
||||||
/* PE options */
|
/* PE options */
|
||||||
|
@ -247,6 +248,7 @@ static struct option longopts[] = {
|
||||||
{"output-def", required_argument, NULL, OPTION_OUT_DEF},
|
{"output-def", required_argument, NULL, OPTION_OUT_DEF},
|
||||||
{"export-all-symbols", no_argument, NULL, OPTION_EXPORT_ALL},
|
{"export-all-symbols", no_argument, NULL, OPTION_EXPORT_ALL},
|
||||||
{"exclude-symbols", required_argument, NULL, OPTION_EXCLUDE_SYMBOLS},
|
{"exclude-symbols", required_argument, NULL, OPTION_EXCLUDE_SYMBOLS},
|
||||||
|
{"exclude-libs", required_argument, NULL, OPTION_EXCLUDE_LIBS},
|
||||||
{"kill-at", no_argument, NULL, OPTION_KILL_ATS},
|
{"kill-at", no_argument, NULL, OPTION_KILL_ATS},
|
||||||
{"add-stdcall-alias", no_argument, NULL, OPTION_STDCALL_ALIASES},
|
{"add-stdcall-alias", no_argument, NULL, OPTION_STDCALL_ALIASES},
|
||||||
{"enable-stdcall-fixup", no_argument, NULL, OPTION_ENABLE_STDCALL_FIXUP},
|
{"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, _(" --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, _(" --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-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, _(" --export-all-symbols Automatically export all globals to DLL\n"));
|
||||||
fprintf (file, _(" --kill-at Remove @nn from exported symbols\n"));
|
fprintf (file, _(" --kill-at Remove @nn from exported symbols\n"));
|
||||||
fprintf (file, _(" --out-implib <file> Generate import library\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;
|
pe_dll_export_everything = 1;
|
||||||
break;
|
break;
|
||||||
case OPTION_EXCLUDE_SYMBOLS:
|
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;
|
break;
|
||||||
case OPTION_KILL_ATS:
|
case OPTION_KILL_ATS:
|
||||||
pe_dll_kill_ats = 1;
|
pe_dll_kill_ats = 1;
|
||||||
|
|
|
@ -1665,6 +1665,14 @@ These cygwin-excludes are: @code{_cygwin_dll_entry@@12},
|
||||||
Specifies a list of symbols which should not be automatically
|
Specifies a list of symbols which should not be automatically
|
||||||
exported. The symbol names may be delimited by commas or colons.
|
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
|
@kindex --file-alignment
|
||||||
@item --file-alignment
|
@item --file-alignment
|
||||||
Specify the file alignment. Sections in the file will always begin at
|
Specify the file alignment. Sections in the file will always begin at
|
||||||
|
|
33
ld/pe-dll.c
33
ld/pe-dll.c
|
@ -231,6 +231,9 @@ static autofilter_entry_type autofilter_liblist[] =
|
||||||
{ "libgcc.", 7 },
|
{ "libgcc.", 7 },
|
||||||
{ "libstdc++.", 10 },
|
{ "libstdc++.", 10 },
|
||||||
{ "libmingw32.", 11 },
|
{ "libmingw32.", 11 },
|
||||||
|
{ "libg2c.", 7 },
|
||||||
|
{ "libsupc++.", 10 },
|
||||||
|
{ "libobjc.", 8 },
|
||||||
{ NULL, 0 }
|
{ NULL, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -244,6 +247,8 @@ static autofilter_entry_type autofilter_objlist[] =
|
||||||
{ "gcrt0.o", 7 },
|
{ "gcrt0.o", 7 },
|
||||||
{ "gcrt1.o", 7 },
|
{ "gcrt1.o", 7 },
|
||||||
{ "gcrt2.o", 7 },
|
{ "gcrt2.o", 7 },
|
||||||
|
{ "crtbegin.o", 10 },
|
||||||
|
{ "crtend.o", 8 },
|
||||||
{ NULL, 0 }
|
{ NULL, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -368,14 +373,16 @@ typedef struct exclude_list_struct
|
||||||
{
|
{
|
||||||
char *string;
|
char *string;
|
||||||
struct exclude_list_struct *next;
|
struct exclude_list_struct *next;
|
||||||
|
int type;
|
||||||
}
|
}
|
||||||
exclude_list_struct;
|
exclude_list_struct;
|
||||||
|
|
||||||
static struct exclude_list_struct *excludes = 0;
|
static struct exclude_list_struct *excludes = 0;
|
||||||
|
|
||||||
void
|
void
|
||||||
pe_dll_add_excludes (new_excludes)
|
pe_dll_add_excludes (new_excludes, type)
|
||||||
const char *new_excludes;
|
const char *new_excludes;
|
||||||
|
const int type;
|
||||||
{
|
{
|
||||||
char *local_copy;
|
char *local_copy;
|
||||||
char *exclude_string;
|
char *exclude_string;
|
||||||
|
@ -391,6 +398,7 @@ pe_dll_add_excludes (new_excludes)
|
||||||
xmalloc (sizeof (struct exclude_list_struct)));
|
xmalloc (sizeof (struct exclude_list_struct)));
|
||||||
new_exclude->string = (char *) xmalloc (strlen (exclude_string) + 1);
|
new_exclude->string = (char *) xmalloc (strlen (exclude_string) + 1);
|
||||||
strcpy (new_exclude->string, exclude_string);
|
strcpy (new_exclude->string, exclude_string);
|
||||||
|
new_exclude->type = type;
|
||||||
new_exclude->next = excludes;
|
new_exclude->next = excludes;
|
||||||
excludes = new_exclude;
|
excludes = new_exclude;
|
||||||
}
|
}
|
||||||
|
@ -398,6 +406,7 @@ pe_dll_add_excludes (new_excludes)
|
||||||
free (local_copy);
|
free (local_copy);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* abfd is a bfd containing n (or NULL)
|
/* abfd is a bfd containing n (or NULL)
|
||||||
It can be used for contextual checks. */
|
It can be used for contextual checks. */
|
||||||
|
|
||||||
|
@ -410,6 +419,9 @@ auto_export (abfd, d, n)
|
||||||
int i;
|
int i;
|
||||||
struct exclude_list_struct *ex;
|
struct exclude_list_struct *ex;
|
||||||
autofilter_entry_type *afptr;
|
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. */
|
/* We should not re-export imported stuff. */
|
||||||
if (strncmp (n, "_imp__", 6) == 0)
|
if (strncmp (n, "_imp__", 6) == 0)
|
||||||
|
@ -429,14 +441,14 @@ auto_export (abfd, d, n)
|
||||||
n, abfd, abfd->my_archive);
|
n, abfd, abfd->my_archive);
|
||||||
|
|
||||||
/* First of all, make context checks:
|
/* First of all, make context checks:
|
||||||
Don't export anything from libgcc. */
|
Don't export anything from standard libs. */
|
||||||
if (abfd && abfd->my_archive)
|
if (libname)
|
||||||
{
|
{
|
||||||
afptr = autofilter_liblist;
|
afptr = autofilter_liblist;
|
||||||
|
|
||||||
while (afptr->name)
|
while (afptr->name)
|
||||||
{
|
{
|
||||||
if (strstr (abfd->my_archive->filename, afptr->name))
|
if (strncmp (libname, afptr->name, afptr->len) == 0 )
|
||||||
return 0;
|
return 0;
|
||||||
afptr++;
|
afptr++;
|
||||||
}
|
}
|
||||||
|
@ -495,8 +507,17 @@ auto_export (abfd, d, n)
|
||||||
}
|
}
|
||||||
|
|
||||||
for (ex = excludes; ex; ex = ex->next)
|
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;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,7 +36,7 @@ extern int pe_dll_compat_implib;
|
||||||
extern int pe_dll_extra_pe_debug;
|
extern int pe_dll_extra_pe_debug;
|
||||||
|
|
||||||
extern void pe_dll_id_target PARAMS ((const char *));
|
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_def_file PARAMS ((const char *));
|
||||||
extern void pe_dll_generate_implib PARAMS ((def_file *, 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 *));
|
extern void pe_process_import_defs PARAMS ((bfd *, struct bfd_link_info *));
|
||||||
|
|
Loading…
Reference in New Issue