From: Thiemo Seufer Date: Tue, 15 Aug 2006 18:28:48 +0000 (+0000) Subject: * elf32-mips.c, elf64-mips.c, elfn32-mips.c X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8992f0d7c2d63ad6b5c102572be103791c6a958e;p=binutils-gdb.git * elf32-mips.c, elf64-mips.c, elfn32-mips.c (elf_backend_merge_symbol_attribute): Define. * elflink.c (elf_link_add_object_symbols): Merge only the ELF visibility flags. * elfxx-mips.c (_bfd_mips_elf_merge_symbol_attribute): New function. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 2d3538cf2e4..a5a0df1118a 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,12 @@ +2006-08-15 Thiemo Seufer + Nigel Stephens + + * elf32-mips.c, elf64-mips.c, elfn32-mips.c + (elf_backend_merge_symbol_attribute): Define. + * elflink.c (elf_link_add_object_symbols): Merge only the ELF + visibility flags. + * elfxx-mips.c (_bfd_mips_elf_merge_symbol_attribute): New function. + 2006-08-15 Thiemo Seufer Nigel Stephens David Ung diff --git a/bfd/elf32-mips.c b/bfd/elf32-mips.c index e86d95523c9..1a293a051e1 100644 --- a/bfd/elf32-mips.c +++ b/bfd/elf32-mips.c @@ -1505,6 +1505,8 @@ static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = { #define elf_backend_create_dynamic_sections \ _bfd_mips_elf_create_dynamic_sections #define elf_backend_check_relocs _bfd_mips_elf_check_relocs +#define elf_backend_merge_symbol_attribute \ + _bfd_mips_elf_merge_symbol_attribute #define elf_backend_adjust_dynamic_symbol \ _bfd_mips_elf_adjust_dynamic_symbol #define elf_backend_always_size_sections \ diff --git a/bfd/elf64-mips.c b/bfd/elf64-mips.c index aa33cf7d6cc..09d13e862ff 100644 --- a/bfd/elf64-mips.c +++ b/bfd/elf64-mips.c @@ -3026,6 +3026,8 @@ const struct elf_size_info mips_elf64_size_info = #define elf_backend_create_dynamic_sections \ _bfd_mips_elf_create_dynamic_sections #define elf_backend_check_relocs _bfd_mips_elf_check_relocs +#define elf_backend_merge_symbol_attribute \ + _bfd_mips_elf_merge_symbol_attribute #define elf_backend_adjust_dynamic_symbol \ _bfd_mips_elf_adjust_dynamic_symbol #define elf_backend_always_size_sections \ diff --git a/bfd/elflink.c b/bfd/elflink.c index ba0e77e3aa4..a7657f9f002 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -4058,13 +4058,13 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info) isym->st_other = (STV_HIDDEN | (isym->st_other & ~ELF_ST_VISIBILITY (-1))); - if (isym->st_other != 0 && !dynamic) + if (ELF_ST_VISIBILITY (isym->st_other) != 0 && !dynamic) { unsigned char hvis, symvis, other, nvis; - /* Take the balance of OTHER from the definition. */ - other = (definition ? isym->st_other : h->other); - other &= ~ ELF_ST_VISIBILITY (-1); + /* Only merge the visibility. Leave the remainder of the + st_other field to elf_backend_merge_symbol_attribute. */ + other = h->other & ~ELF_ST_VISIBILITY (-1); /* Combine visibilities, using the most constraining one. */ hvis = ELF_ST_VISIBILITY (h->other); diff --git a/bfd/elfn32-mips.c b/bfd/elfn32-mips.c index 275e83cdc11..1e42faaf537 100644 --- a/bfd/elfn32-mips.c +++ b/bfd/elfn32-mips.c @@ -2293,6 +2293,8 @@ static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = { #define elf_backend_create_dynamic_sections \ _bfd_mips_elf_create_dynamic_sections #define elf_backend_check_relocs _bfd_mips_elf_check_relocs +#define elf_backend_merge_symbol_attribute \ + _bfd_mips_elf_merge_symbol_attribute #define elf_backend_adjust_dynamic_symbol \ _bfd_mips_elf_adjust_dynamic_symbol #define elf_backend_always_size_sections \ diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c index 8ebd2f9450b..cdc81a229d5 100644 --- a/bfd/elfxx-mips.c +++ b/bfd/elfxx-mips.c @@ -11115,15 +11115,25 @@ const struct bfd_elf_special_section _bfd_mips_elf_special_sections[] = { NULL, 0, 0, 0, 0 } }; -/* Ensure that the STO_OPTIONAL flag is copied into h->other, - even if this is not a defintion of the symbol. */ +/* Merge non visibility st_other attributes. Ensure that the + STO_OPTIONAL flag is copied into h->other, even if this is not a + definiton of the symbol. */ void _bfd_mips_elf_merge_symbol_attribute (struct elf_link_hash_entry *h, const Elf_Internal_Sym *isym, bfd_boolean definition, bfd_boolean dynamic ATTRIBUTE_UNUSED) { - if (! definition + if ((isym->st_other & ~ELF_ST_VISIBILITY (-1)) != 0) + { + unsigned char other; + + other = (definition ? isym->st_other : h->other); + other &= ~ELF_ST_VISIBILITY (-1); + h->other = other | ELF_ST_VISIBILITY (h->other); + } + + if (!definition && ELF_MIPS_IS_OPTIONAL (isym->st_other)) h->other |= STO_OPTIONAL; }