* bfd.c (struct _bfd): Correct outsymbols comment.
	* bfd-in2.h: Regenerate.
	* linker.c (bfd_generic_link_read_symbols): Renamed from..
	(generic_link_read_symbols): ..this, and made global.

include/
	* bfdlink.h (bfd_generic_link_read_symbols): Declare.
ld/
	PR 6478
	* ldcref.c (check_local_sym_xref): Use bfd_generic_link_read_symbols.
	Don't free symbol pointer array.
	(check_refs): Likewise.
	* ldmain.c (warning_callback): Likewise.
	* ldmisc.c (vfinfo): Likewise.
	* pe-dll.c (process_def_file): Likewise.
	(pe_walk_relocs_of_symbol, generate_reloc): Likewise.
	* emultempl/pe.em (pe_find_data_imports): Likewise.
	(gld_${EMULATION_NAME}_after_open): Likewise.
	* emultempl/pep.em (pep_find_data_imports): Likewise.
	(gld_${EMULATION_NAME}_after_open): Likewise.
	* ldlang.h (lang_input_statement_type): Delete asymbols, symbol_count,
	passive_position, closed.
	* ldlang.c (new_afile): Don't set asymbols and symbol_count.
	* ldmain.c (add_archive_element): xcalloc lang_input_statement_type.
This commit is contained in:
Alan Modra 2008-08-17 03:12:50 +00:00
parent 1f5064de53
commit 5c1d2f5f4c
15 changed files with 121 additions and 184 deletions

View file

@ -478,36 +478,16 @@ static void
check_local_sym_xref (lang_input_statement_type *statement)
{
bfd *abfd;
lang_input_statement_type *li;
asymbol **asymbols, **syms;
asymbol **syms;
abfd = statement->the_bfd;
if (abfd == NULL)
return;
li = abfd->usrdata;
if (li != NULL && li->asymbols != NULL)
asymbols = li->asymbols;
else
{
long symsize;
long symbol_count;
if (!bfd_generic_link_read_symbols (abfd))
einfo (_("%B%F: could not read symbols: %E\n"), abfd);
symsize = bfd_get_symtab_upper_bound (abfd);
if (symsize < 0)
einfo (_("%B%F: could not read symbols; %E\n"), abfd);
asymbols = xmalloc (symsize);
symbol_count = bfd_canonicalize_symtab (abfd, asymbols);
if (symbol_count < 0)
einfo (_("%B%F: could not read symbols: %E\n"), abfd);
if (li != NULL)
{
li->asymbols = asymbols;
li->symbol_count = symbol_count;
}
}
for (syms = asymbols; *syms; ++syms)
for (syms = bfd_get_outsymbols (abfd); *syms; ++syms)
{
asymbol *sym = *syms;
if (sym->flags & (BSF_GLOBAL | BSF_WARNING | BSF_INDIRECT | BSF_FILE))
@ -529,9 +509,6 @@ check_local_sym_xref (lang_input_statement_type *statement)
check_refs (symname, FALSE, sym->section, abfd, ncrs);
}
}
if (li == NULL)
free (asymbols);
}
/* Check one symbol to see if it is a prohibited cross reference. */
@ -597,8 +574,6 @@ check_refs (const char *name,
bfd *abfd,
struct lang_nocrossrefs *ncrs)
{
lang_input_statement_type *li;
asymbol **asymbols;
struct check_refs_info info;
/* We need to look through the relocations for this BFD, to see
@ -607,37 +582,15 @@ check_refs (const char *name,
the BFD in which the symbol is defined, since even a single
BFD might contain a prohibited cross reference. */
li = abfd->usrdata;
if (li != NULL && li->asymbols != NULL)
asymbols = li->asymbols;
else
{
long symsize;
long symbol_count;
symsize = bfd_get_symtab_upper_bound (abfd);
if (symsize < 0)
einfo (_("%B%F: could not read symbols; %E\n"), abfd);
asymbols = xmalloc (symsize);
symbol_count = bfd_canonicalize_symtab (abfd, asymbols);
if (symbol_count < 0)
einfo (_("%B%F: could not read symbols: %E\n"), abfd);
if (li != NULL)
{
li->asymbols = asymbols;
li->symbol_count = symbol_count;
}
}
if (!bfd_generic_link_read_symbols (abfd))
einfo (_("%B%F: could not read symbols: %E\n"), abfd);
info.sym_name = name;
info.global = global;
info.defsec = sec;
info.ncrs = ncrs;
info.asymbols = asymbols;
info.asymbols = bfd_get_outsymbols (abfd);
bfd_map_over_sections (abfd, check_reloc_refs, &info);
if (li == NULL)
free (asymbols);
}
/* This is called via bfd_map_over_sections. INFO->SYM_NAME is a symbol