Display the reference causing a shared library to be needed

Adds a section for --as-needed libraries to a linker map file, similar
to what we do for archive libraries.

bfd/
	* elflink.c (elf_link_add_object_symbols): Call minfo for --as-needed.
ld/
	* ldlang.c (asneeded_list_head, asneeded_list_tail): New vars.
	(lang_init): Initialise them.
	(lang_print_asneeded): New function.
	(lang_process): Call lang_print_asneeded.
	* ldlang.h (struct asneeded_minfo): New.
	(asneeded_list_tail): Declare.
	* ldmain.c (add_archive_element): Improve archive map heading.
	* ldmisc.c (minfo): Stash --as-needed info.
This commit is contained in:
Alan Modra 2014-01-22 16:05:12 +10:30
parent cda796e168
commit 16e4ecc0db
7 changed files with 89 additions and 2 deletions

View file

@ -67,6 +67,7 @@ static struct bfd_hash_table lang_definedness_table;
static lang_statement_list_type *stat_save[10];
static lang_statement_list_type **stat_save_ptr = &stat_save[0];
static struct unique_sections *unique_section_list;
static struct asneeded_minfo *asneeded_list_head;
/* Forward declarations. */
static void exp_init_os (etree_type *);
@ -105,6 +106,7 @@ bfd_boolean lang_float_flag = FALSE;
bfd_boolean delete_output_file_on_failure = FALSE;
struct lang_phdr *lang_phdr_list;
struct lang_nocrossrefs *nocrossref_list;
struct asneeded_minfo **asneeded_list_tail;
/* Functions that traverse the linker script and might evaluate
DEFINED() need to increment this at the start of the traversal. */
@ -1228,6 +1230,9 @@ lang_init (void)
sizeof (struct lang_definedness_hash_entry),
13))
einfo (_("%P%F: can not create hash table: %E\n"));
asneeded_list_head = NULL;
asneeded_list_tail = &asneeded_list_head;
}
void
@ -1953,6 +1958,43 @@ lang_insert_orphan (asection *s,
return os;
}
static void
lang_print_asneeded (void)
{
struct asneeded_minfo *m;
char buf[100];
if (asneeded_list_head == NULL)
return;
sprintf (buf, _("\nAs-needed library included "
"to satisfy reference by file (symbol)\n\n"));
minfo ("%s", buf);
for (m = asneeded_list_head; m != NULL; m = m->next)
{
size_t len;
minfo ("%s", m->soname);
len = strlen (m->soname);
if (len >= 29)
{
print_nl ();
len = 0;
}
while (len < 30)
{
print_space ();
++len;
}
if (m->ref != NULL)
minfo ("%B ", m->ref);
minfo ("(%T)\n", m->name);
}
}
static void
lang_map_flags (flagword flag)
{
@ -6629,6 +6671,8 @@ lang_process (void)
link_info.gc_sym_list = ldlang_undef_chain_list_head;
ldemul_after_open ();
if (config.map_file != NULL)
lang_print_asneeded ();
bfd_section_already_linked_table_free ();