forked from Imagelibrary/binutils-gdb
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:
28
ld/ldfile.c
28
ld/ldfile.c
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user