diff options
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 15 | ||||
-rw-r--r-- | bfd/elf-bfd.h | 6 | ||||
-rw-r--r-- | bfd/elf.c | 4 | ||||
-rw-r--r-- | bfd/elf32-arm.c | 5 | ||||
-rw-r--r-- | bfd/elf32-i386.c | 5 | ||||
-rw-r--r-- | bfd/elf32-ppc.c | 5 | ||||
-rw-r--r-- | bfd/elf32-sparc.c | 5 | ||||
-rw-r--r-- | bfd/elf64-ppc.c | 6 | ||||
-rw-r--r-- | bfd/elf64-sparc.c | 5 | ||||
-rw-r--r-- | bfd/elf64-x86-64.c | 5 |
10 files changed, 43 insertions, 18 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 3730ee7..ae399e6 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,18 @@ +2011-04-11 Mark Wielaard <mjw@redhat.com> + + PR 10549 + * elf-bfd.h (has_ifunc_symbols): Renamed to has_gnu_symbols. + (has_gnu_symbols): Renamed from has_ifunc_symbols. + * elf.c (_bfd_elf_set_osabi): Use new has_gnu_symbols name. + * elf32-arm.c (elf32_arm_add_symbol_hook): Set has_gnu_symbols + also if STB_GNU_UNIQUE symbol binding was seen. + * elf32-i386.c (elf_i386_add_symbol_hook): Likewise. + * elf32-ppc.c (ppc_elf_add_symbol_hook): Likewise. + * elf32-sparc.c (elf32_sparc_add_symbol_hook): Likewise. + * elf64-ppc.c (ppc64_elf_add_symbol_hook): Likewise. + * elf64-sparc.c (elf64_sparc_add_symbol_hook): Likewise. + * elf64-x86-64.c (elf_x86_64_add_symbol_hook): Likewise. + 2011-04-11 Alan Modra <amodra@gmail.com> * bfd-in.h (bfd_get_section_limit): Don't use rawsize with output diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index 21ec38f..844610d 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -1634,9 +1634,9 @@ struct elf_obj_tdata bfd_byte *build_id; /* True if the bfd contains symbols that have the STT_GNU_IFUNC - symbol type. Used to set the osabi field in the ELF header - structure. */ - bfd_boolean has_ifunc_symbols; + symbol type or STB_GNU_UNIQUE binding. Used to set the osabi + field in the ELF header structure. */ + bfd_boolean has_gnu_symbols; /* An identifier used to distinguish different target specific extensions to this structure. */ @@ -9506,9 +9506,9 @@ _bfd_elf_set_osabi (bfd * abfd, /* To make things simpler for the loader on Linux systems we set the osabi field to ELFOSABI_LINUX if the binary contains symbols of - the STT_GNU_IFUNC type. */ + the STT_GNU_IFUNC type or STB_GNU_UNIQUE binding. */ if (i_ehdrp->e_ident[EI_OSABI] == ELFOSABI_NONE - && elf_tdata (abfd)->has_ifunc_symbols) + && elf_tdata (abfd)->has_gnu_symbols) i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_LINUX; } diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c index 6b69fd6..035d584 100644 --- a/bfd/elf32-arm.c +++ b/bfd/elf32-arm.c @@ -15230,8 +15230,9 @@ elf32_arm_add_symbol_hook (bfd *abfd, struct bfd_link_info *info, flagword *flagsp, asection **secp, bfd_vma *valp) { if ((abfd->flags & DYNAMIC) == 0 - && ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC) - elf_tdata (info->output_bfd)->has_ifunc_symbols = TRUE; + && (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC + || ELF_ST_BIND (sym->st_info) == STB_GNU_UNIQUE)) + elf_tdata (info->output_bfd)->has_gnu_symbols = TRUE; if (elf32_arm_hash_table (info)->vxworks_p && !elf_vxworks_add_symbol_hook (abfd, info, sym, namep, diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index 3d8e2df..1896881 100644 --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -4705,8 +4705,9 @@ elf_i386_add_symbol_hook (bfd * abfd, bfd_vma * valp ATTRIBUTE_UNUSED) { if ((abfd->flags & DYNAMIC) == 0 - && ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC) - elf_tdata (info->output_bfd)->has_ifunc_symbols = TRUE; + && (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC + || ELF_ST_BIND (sym->st_info) == STB_GNU_UNIQUE)) + elf_tdata (info->output_bfd)->has_gnu_symbols = TRUE; return TRUE; } diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index 9e097ad..c736375 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -3113,8 +3113,9 @@ ppc_elf_add_symbol_hook (bfd *abfd, } if ((abfd->flags & DYNAMIC) == 0 - && ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC) - elf_tdata (info->output_bfd)->has_ifunc_symbols = TRUE; + && (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC + || ELF_ST_BIND (sym->st_info) == STB_GNU_UNIQUE)) + elf_tdata (info->output_bfd)->has_gnu_symbols = TRUE; return TRUE; } diff --git a/bfd/elf32-sparc.c b/bfd/elf32-sparc.c index 187d466..2d9deab 100644 --- a/bfd/elf32-sparc.c +++ b/bfd/elf32-sparc.c @@ -180,8 +180,9 @@ elf32_sparc_add_symbol_hook (bfd * abfd, bfd_vma * valp ATTRIBUTE_UNUSED) { if ((abfd->flags & DYNAMIC) == 0 - && ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC) - elf_tdata (info->output_bfd)->has_ifunc_symbols = TRUE; + && (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC + || ELF_ST_BIND (sym->st_info) == STB_GNU_UNIQUE)) + elf_tdata (info->output_bfd)->has_gnu_symbols = TRUE; return TRUE; } diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index 4cbd941..eb07b1f 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -4569,10 +4569,14 @@ ppc64_elf_add_symbol_hook (bfd *ibfd, asection **sec, bfd_vma *value ATTRIBUTE_UNUSED) { + if ((ibfd->flags & DYNAMIC) == 0 + && ELF_ST_BIND (isym->st_info) == STB_GNU_UNIQUE) + elf_tdata (info->output_bfd)->has_gnu_symbols = TRUE; + if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC) { if ((ibfd->flags & DYNAMIC) == 0) - elf_tdata (info->output_bfd)->has_ifunc_symbols = TRUE; + elf_tdata (info->output_bfd)->has_gnu_symbols = TRUE; } else if (ELF_ST_TYPE (isym->st_info) == STT_FUNC) ; diff --git a/bfd/elf64-sparc.c b/bfd/elf64-sparc.c index 6bb2389..c4e97a7 100644 --- a/bfd/elf64-sparc.c +++ b/bfd/elf64-sparc.c @@ -426,8 +426,9 @@ elf64_sparc_add_symbol_hook (bfd *abfd, struct bfd_link_info *info, static const char *const stt_types[] = { "NOTYPE", "OBJECT", "FUNCTION" }; if ((abfd->flags & DYNAMIC) == 0 - && ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC) - elf_tdata (info->output_bfd)->has_ifunc_symbols = TRUE; + && (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC + || ELF_ST_BIND (sym->st_info) == STB_GNU_UNIQUE)) + elf_tdata (info->output_bfd)->has_gnu_symbols = TRUE; if (ELF_ST_TYPE (sym->st_info) == STT_REGISTER) { diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index 89a5ab0..84ee101 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -4457,8 +4457,9 @@ elf_x86_64_add_symbol_hook (bfd *abfd, } if ((abfd->flags & DYNAMIC) == 0 - && ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC) - elf_tdata (info->output_bfd)->has_ifunc_symbols = TRUE; + && (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC + || ELF_ST_BIND (sym->st_info) == STB_GNU_UNIQUE)) + elf_tdata (info->output_bfd)->has_gnu_symbols = TRUE; return TRUE; } |