PR ld/14426
	* bfdlink.h (bfd_link_info): Add ignore_hash.
ld/
	PR ld/14426
	* ldlex.h (option_values): Add OPTION_IGNORE_UNRESOLVED_SYMBOL.
	* lexsup.c (parse_args): Likewise.
	(ld_options): Describe --ignore-unresolved-symbol.
	* ldmain.h (add_ignoresym): Declare.
	* ldmain.c (add_ignoresym): New function, extracted from..
	(undefined_symbol): ..here.  Return if the symbol is in ignore_hash.
	(constructor_callback): Don't use global link_info here.
	(reloc_overflow): Likewise.
This commit is contained in:
Alan Modra
2012-10-22 13:33:49 +00:00
parent ef8e09a081
commit 0e86e20e04
7 changed files with 57 additions and 20 deletions

View File

@@ -643,6 +643,23 @@ add_ysym (const char *name)
einfo (_("%P%F: bfd_hash_lookup failed: %E\n"));
}
void
add_ignoresym (struct bfd_link_info *info, const char *name)
{
if (info->ignore_hash == NULL)
{
info->ignore_hash = xmalloc (sizeof (struct bfd_hash_table));
if (! bfd_hash_table_init_n (info->ignore_hash,
bfd_hash_newfunc,
sizeof (struct bfd_hash_entry),
61))
einfo (_("%P%F: bfd_hash_table_init failed: %E\n"));
}
if (bfd_hash_lookup (info->ignore_hash, name, TRUE, TRUE) == NULL)
einfo (_("%P%F: bfd_hash_lookup failed: %E\n"));
}
/* Record a symbol to be wrapped, from the --wrap option. */
void
@@ -1091,7 +1108,7 @@ constructor_callback (struct bfd_link_info *info,
/* Ensure that BFD_RELOC_CTOR exists now, so that we can give a
useful error message. */
if (bfd_reloc_type_lookup (link_info.output_bfd, BFD_RELOC_CTOR) == NULL
if (bfd_reloc_type_lookup (info->output_bfd, BFD_RELOC_CTOR) == NULL
&& (info->relocatable
|| bfd_reloc_type_lookup (abfd, BFD_RELOC_CTOR) == NULL))
einfo (_("%P%F: BFD backend error: BFD_RELOC_CTOR unsupported\n"));
@@ -1228,7 +1245,7 @@ warning_find_reloc (bfd *abfd, asection *sec, void *iarg)
/* This is called when an undefined symbol is found. */
static bfd_boolean
undefined_symbol (struct bfd_link_info *info ATTRIBUTE_UNUSED,
undefined_symbol (struct bfd_link_info *info,
const char *name,
bfd *abfd,
asection *section,
@@ -1240,25 +1257,14 @@ undefined_symbol (struct bfd_link_info *info ATTRIBUTE_UNUSED,
#define MAX_ERRORS_IN_A_ROW 5
if (info->ignore_hash != NULL
&& bfd_hash_lookup (info->ignore_hash, name, FALSE, FALSE) != NULL)
return TRUE;
if (config.warn_once)
{
static struct bfd_hash_table *hash;
/* Only warn once about a particular undefined symbol. */
if (hash == NULL)
{
hash = (struct bfd_hash_table *)
xmalloc (sizeof (struct bfd_hash_table));
if (!bfd_hash_table_init (hash, bfd_hash_newfunc,
sizeof (struct bfd_hash_entry)))
einfo (_("%F%P: bfd_hash_table_init failed: %E\n"));
}
if (bfd_hash_lookup (hash, name, FALSE, FALSE) != NULL)
return TRUE;
if (bfd_hash_lookup (hash, name, TRUE, TRUE) == NULL)
einfo (_("%F%P: bfd_hash_lookup failed: %E\n"));
add_ignoresym (info, name);
}
/* We never print more than a reasonable number of errors in a row
@@ -1336,7 +1342,7 @@ int overflow_cutoff_limit = 10;
/* This is called when a reloc overflows. */
static bfd_boolean
reloc_overflow (struct bfd_link_info *info ATTRIBUTE_UNUSED,
reloc_overflow (struct bfd_link_info *info,
struct bfd_link_hash_entry *entry,
const char *name,
const char *reloc_name,
@@ -1375,7 +1381,7 @@ reloc_overflow (struct bfd_link_info *info ATTRIBUTE_UNUSED,
reloc_name, entry->root.string,
entry->u.def.section,
entry->u.def.section == bfd_abs_section_ptr
? link_info.output_bfd : entry->u.def.section->owner);
? info->output_bfd : entry->u.def.section->owner);
break;
default:
abort ();