diff options
author | Alan Modra <amodra@gmail.com> | 2011-04-20 00:22:08 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2011-04-20 00:22:08 +0000 |
commit | 02d002477b60cff9f0f5abbd5fc27e2889b13421 (patch) | |
tree | ddb5245de932bf699df9cd2dda541ad9c96eef26 /bfd/elflink.c | |
parent | 24f58f47de96a6c061fc6eeb37a699c03dde970a (diff) | |
download | gdb-02d002477b60cff9f0f5abbd5fc27e2889b13421.zip gdb-02d002477b60cff9f0f5abbd5fc27e2889b13421.tar.gz gdb-02d002477b60cff9f0f5abbd5fc27e2889b13421.tar.bz2 |
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.
Diffstat (limited to 'bfd/elflink.c')
-rw-r--r-- | bfd/elflink.c | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/bfd/elflink.c b/bfd/elflink.c index f0ad579..110bb66 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -3937,18 +3937,31 @@ error_free_dyn: goto error_free_vers; if (isym->st_shndx == SHN_COMMON - && ELF_ST_TYPE (isym->st_info) == STT_TLS - && !info->relocatable) + && (abfd->flags & BFD_PLUGIN) != 0) + { + asection *xc = bfd_get_section_by_name (abfd, "COMMON"); + + if (xc == NULL) + { + flagword sflags = (SEC_ALLOC | SEC_IS_COMMON | SEC_KEEP + | SEC_EXCLUDE); + xc = bfd_make_section_with_flags (abfd, "COMMON", sflags); + if (xc == NULL) + goto error_free_vers; + } + sec = xc; + } + else if (isym->st_shndx == SHN_COMMON + && ELF_ST_TYPE (isym->st_info) == STT_TLS + && !info->relocatable) { asection *tcomm = bfd_get_section_by_name (abfd, ".tcommon"); if (tcomm == NULL) { - tcomm = bfd_make_section_with_flags (abfd, ".tcommon", - (SEC_ALLOC - | SEC_IS_COMMON - | SEC_LINKER_CREATED - | SEC_THREAD_LOCAL)); + flagword sflags = (SEC_ALLOC | SEC_THREAD_LOCAL | SEC_IS_COMMON + | SEC_LINKER_CREATED); + tcomm = bfd_make_section_with_flags (abfd, ".tcommon", sflags); if (tcomm == NULL) goto error_free_vers; } |