include/
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:
parent
ef8e09a081
commit
0e86e20e04
@ -1,3 +1,8 @@
|
||||
2012-10-22 Jan Beich <jbeich@tormail.org>
|
||||
|
||||
PR ld/14426
|
||||
* bfdlink.h (bfd_link_info): Add ignore_hash.
|
||||
|
||||
2012-10-08 Jason Merrill <jason@redhat.com>
|
||||
|
||||
* demangle.h (enum demangle_component_type): Add
|
||||
|
@ -435,6 +435,10 @@ struct bfd_link_info
|
||||
option). If this is NULL, no symbols are being wrapped. */
|
||||
struct bfd_hash_table *wrap_hash;
|
||||
|
||||
/* Hash table of symbols which may be left unresolved during
|
||||
a link. If this is NULL, no symbols can be left unresolved. */
|
||||
struct bfd_hash_table *ignore_hash;
|
||||
|
||||
/* The output BFD. */
|
||||
bfd *output_bfd;
|
||||
|
||||
|
13
ld/ChangeLog
13
ld/ChangeLog
@ -1,3 +1,16 @@
|
||||
2012-10-22 Jan Beich <jbeich@tormail.org>
|
||||
Alan Modra <amodra@gmail.com>
|
||||
|
||||
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.
|
||||
|
||||
2012-10-22 Alan Modra <amodra@gmail.com>
|
||||
|
||||
* plugin.c (plugin_load_plugins): Warning fix.
|
||||
|
@ -135,6 +135,7 @@ enum option_values
|
||||
#endif /* ENABLE_PLUGINS */
|
||||
OPTION_DEFAULT_SCRIPT,
|
||||
OPTION_PRINT_OUTPUT_FORMAT,
|
||||
OPTION_IGNORE_UNRESOLVED_SYMBOL,
|
||||
};
|
||||
|
||||
/* The initial parser states. */
|
||||
|
46
ld/ldmain.c
46
ld/ldmain.c
@ -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 ();
|
||||
|
@ -41,6 +41,7 @@ extern int overflow_cutoff_limit;
|
||||
|
||||
extern void add_ysym (const char *);
|
||||
extern void add_wrap (const char *);
|
||||
extern void add_ignoresym (struct bfd_link_info *, const char *);
|
||||
extern void add_keepsyms_file (const char *);
|
||||
|
||||
#endif
|
||||
|
@ -496,6 +496,10 @@ static const struct ld_option ld_options[] =
|
||||
TWO_DASHES },
|
||||
{ {"wrap", required_argument, NULL, OPTION_WRAP},
|
||||
'\0', N_("SYMBOL"), N_("Use wrapper functions for SYMBOL"), TWO_DASHES },
|
||||
{ {"ignore-unresolved-symbol", required_argument, NULL,
|
||||
OPTION_IGNORE_UNRESOLVED_SYMBOL},
|
||||
'\0', N_("SYMBOL"),
|
||||
N_("Unresolved SYMBOL will not cause an error or warning"), TWO_DASHES },
|
||||
};
|
||||
|
||||
#define OPTION_COUNT ARRAY_SIZE (ld_options)
|
||||
@ -1341,6 +1345,9 @@ parse_args (unsigned argc, char **argv)
|
||||
case OPTION_WRAP:
|
||||
add_wrap (optarg);
|
||||
break;
|
||||
case OPTION_IGNORE_UNRESOLVED_SYMBOL:
|
||||
add_ignoresym (&link_info, optarg);
|
||||
break;
|
||||
case OPTION_DISCARD_NONE:
|
||||
link_info.discard = discard_none;
|
||||
break;
|
||||
|
Loading…
x
Reference in New Issue
Block a user