diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2010-12-06 00:00:15 +0000 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2010-12-06 00:00:15 +0000 |
commit | cfac8028e44df8140ee4fa9a3d554b1df23e0c0c (patch) | |
tree | da8a750660637a52b1547ccf9531ccc41a51a7eb /ld/plugin.c | |
parent | a2c86c822472bcc1bbe8002946432b2bff666948 (diff) | |
download | gdb-cfac8028e44df8140ee4fa9a3d554b1df23e0c0c.zip gdb-cfac8028e44df8140ee4fa9a3d554b1df23e0c0c.tar.gz gdb-cfac8028e44df8140ee4fa9a3d554b1df23e0c0c.tar.bz2 |
Properly convert LTO plugin visibility to ELF visibility.
ld/
2010-12-05 H.J. Lu <hongjiu.lu@intel.com>
* plugin.c (asymbol_from_plugin_symbol): Properly convert LTO
plugin visibility to ELF visibility.
(is_visible_from_outside): Re-indent.
ld/testsuite/
2010-12-05 H.J. Lu <hongjiu.lu@intel.com>
* ld-plugin/plugin-vis-1.d: Updated.
Diffstat (limited to 'ld/plugin.c')
-rw-r--r-- | ld/plugin.c | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/ld/plugin.c b/ld/plugin.c index 6afc14b..ae9c378 100644 --- a/ld/plugin.c +++ b/ld/plugin.c @@ -307,10 +307,31 @@ asymbol_from_plugin_symbol (bfd *abfd, asymbol *asym, if (bfd_get_flavour (abfd) == bfd_target_elf_flavour) { elf_symbol_type *elfsym = elf_symbol_from (abfd, asym); + unsigned char visibility; + if (!elfsym) einfo (_("%P%F: %s: non-ELF symbol in ELF BFD!"), asym->name); - elfsym->internal_elf_sym.st_other &= ~3; - elfsym->internal_elf_sym.st_other |= ldsym->visibility; + switch (ldsym->visibility) + { + default: + einfo (_("%P%F: unknown ELF symbol visibility: %d!"), + ldsym->visibility); + case LDPV_DEFAULT: + visibility = STV_DEFAULT; + break; + case LDPV_PROTECTED: + visibility = STV_PROTECTED; + break; + case LDPV_INTERNAL: + visibility = STV_INTERNAL; + break; + case LDPV_HIDDEN: + visibility = STV_HIDDEN; + break; + } + elfsym->internal_elf_sym.st_other + = (visibility | (elfsym->internal_elf_sym.st_other + & ~ELF_ST_VISIBILITY (-1))); } return LDPS_OK; @@ -416,8 +437,8 @@ is_visible_from_outside (struct ld_plugin_symbol *lsym, asection *section, opportunities during LTRANS at worst; it will not give false negatives, which can lead to the disastrous conclusion that the related symbol is IRONLY. (See GCC PR46319 for an example.) */ - return lsym->visibility == LDPV_DEFAULT - || lsym->visibility == LDPV_PROTECTED; + return (lsym->visibility == LDPV_DEFAULT + || lsym->visibility == LDPV_PROTECTED); } return FALSE; } |