mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-19 00:59:15 +08:00
bfd/
* bfd-in2.h: Regenerate. * bfd.c (struct bfd): Add no_export. * elflink.c (elf_link_add_object_symbols): Handle no_export. ld/ * ldlang.c (struct excluded_lib, excluded_libs, add_excluded_libs) (check_excluded_libs): New. (load_symbols): Call check_excluded_libs. * ldlang.h (add_excluded_libs): New prototype. * emultempl/elf32.em (OPTION_EXCLUDED_LIBS): Define. (gld${EMULATION_NAME}_add_options): Add --exclude-libs. (gld${EMULATION_NAME}_handle_option): Handle --exclude-libs. * ld.texinfo (Command Line Variables): Document --exclude-libs. (Options Specific to i386 PE Targets): Remove --exclude-libs. ld/testsuite/ * ld-elf/exclude1.s, ld-elf/exclude2.s, ld-elf/exclude.exp: New.
This commit is contained in:
63
ld/ldlang.c
63
ld/ldlang.c
@ -1692,6 +1692,67 @@ lookup_name (const char *name)
|
||||
return search;
|
||||
}
|
||||
|
||||
/* Save LIST as a list of libraries whose symbols should not be exported. */
|
||||
|
||||
struct excluded_lib
|
||||
{
|
||||
char *name;
|
||||
struct excluded_lib *next;
|
||||
};
|
||||
static struct excluded_lib *excluded_libs;
|
||||
|
||||
void
|
||||
add_excluded_libs (const char *list)
|
||||
{
|
||||
const char *p = list, *end;
|
||||
|
||||
while (*p != '\0')
|
||||
{
|
||||
struct excluded_lib *entry;
|
||||
end = strpbrk (p, ",:");
|
||||
if (end == NULL)
|
||||
end = p + strlen (p);
|
||||
entry = xmalloc (sizeof (*entry));
|
||||
entry->next = excluded_libs;
|
||||
entry->name = xmalloc (end - p + 1);
|
||||
memcpy (entry->name, p, end - p);
|
||||
entry->name[end - p] = '\0';
|
||||
excluded_libs = entry;
|
||||
if (*end == '\0')
|
||||
break;
|
||||
p = end + 1;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
check_excluded_libs (bfd *abfd)
|
||||
{
|
||||
struct excluded_lib *lib = excluded_libs;
|
||||
|
||||
while (lib)
|
||||
{
|
||||
int len = strlen (lib->name);
|
||||
const char *filename = lbasename (abfd->filename);
|
||||
|
||||
if (strcmp (lib->name, "ALL") == 0)
|
||||
{
|
||||
abfd->no_export = TRUE;
|
||||
return;
|
||||
}
|
||||
|
||||
if (strncmp (lib->name, filename, len) == 0
|
||||
&& (filename[len] == '\0'
|
||||
|| (filename[len] == '.' && filename[len + 1] == 'a'
|
||||
&& filename[len + 2] == '\0')))
|
||||
{
|
||||
abfd->no_export = TRUE;
|
||||
return;
|
||||
}
|
||||
|
||||
lib = lib->next;
|
||||
}
|
||||
}
|
||||
|
||||
/* Get the symbols for an input file. */
|
||||
|
||||
static bfd_boolean
|
||||
@ -1776,6 +1837,8 @@ load_symbols (lang_input_statement_type *entry,
|
||||
break;
|
||||
|
||||
case bfd_archive:
|
||||
check_excluded_libs (entry->the_bfd);
|
||||
|
||||
if (entry->whole_archive)
|
||||
{
|
||||
bfd *member = NULL;
|
||||
|
Reference in New Issue
Block a user