PR ld/12365

bfd/
	* elfcode.h (elf_slurp_symbol_table): Put common plugin IR symbols
	in their own common section.
	* elflink.c (elf_link_add_object_symbols): Likewise.
	* linker.c (generic_link_check_archive_element): Don't lose flags
	if common section is pre-existing.
	(_bfd_generic_link_add_one_symbol): Likewise.
ld/
	* ldfile.c (ldfile_try_open_bfd): Move code creating and switching
	to plugin IR BFD..
	* ldmain.c (add_archive_element): ..and similar code here..
	* plugin.c (plugin_maybe_claim): ..to here.  New function.
	(plugin_call_claim_file): Make static.
	(asymbol_from_plugin_symbol): Set ELF st_shndx for common syms.
	(plugin_multiple_common): New function.
	(plugin_call_all_symbols_read): Hook in plugin_multiple_common.
	* plugin.h (plugin_call_claim_file): Don't declare.
	(plugin_maybe_claim): Declare.
This commit is contained in:
Alan Modra
2011-04-20 00:22:08 +00:00
parent 24f58f47de
commit 02d002477b
9 changed files with 138 additions and 62 deletions

View File

@@ -1,6 +1,7 @@
/* Linker file opening and searching.
Copyright 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2000, 2001, 2002,
2003, 2004, 2005, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011
Free Software Foundation, Inc.
This file is part of the GNU Binutils.
@@ -320,35 +321,12 @@ success:
if (fd >= 0)
{
struct ld_plugin_input_file file;
int claimed = 0;
file.name = attempt;
file.offset = 0;
file.filesize = lseek (fd, 0, SEEK_END);
file.fd = fd;
/* We create a dummy BFD, initially empty, to house
whatever symbols the plugin may want to add. */
file.handle = plugin_get_ir_dummy_bfd (attempt, entry->the_bfd);
if (plugin_call_claim_file (&file, &claimed))
einfo (_("%P%F: %s: plugin reported error claiming file\n"),
plugin_error_plugin ());
/* fd belongs to us, not the plugin; but we don't need it. */
close (fd);
if (claimed)
{
/* Discard the real file's BFD and substitute the dummy one. */
bfd_close (entry->the_bfd);
entry->the_bfd = file.handle;
entry->claimed = TRUE;
bfd_make_readable (entry->the_bfd);
}
else
{
/* If plugin didn't claim the file, we don't need the dummy
bfd. Can't avoid speculatively creating it, alas. */
bfd_close_all_done (file.handle);
entry->claimed = FALSE;
}
plugin_maybe_claim (&file, entry);
}
}
#endif /* ENABLE_PLUGINS */