From 8992f0d7c2d63ad6b5c102572be103791c6a958e Mon Sep 17 00:00:00 2001 From: Thiemo Seufer Date: Tue, 15 Aug 2006 18:28:48 +0000 Subject: [PATCH] * 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. --- bfd/ChangeLog | 9 +++++++++ bfd/elf32-mips.c | 2 ++ bfd/elf64-mips.c | 2 ++ bfd/elflink.c | 8 ++++---- bfd/elfn32-mips.c | 2 ++ bfd/elfxx-mips.c | 16 +++++++++++++--- 6 files changed, 32 insertions(+), 7 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 2d3538c..a5a0df1 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,14 @@ 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 * config.bfd: Add configurations for mips*el-sde-elf* and diff --git a/bfd/elf32-mips.c b/bfd/elf32-mips.c index e86d955..1a293a0 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 aa33cf7..09d13e8 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 ba0e77e..a7657f9 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 275e83c..1e42faa 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 8ebd2f9..cdc81a2 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; } -- 2.7.4