diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2009-07-21 21:37:26 +0000 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2009-07-21 21:37:26 +0000 |
commit | 2955ec4c12dbffa517fe1d821e7c5d1f7dde5f8a (patch) | |
tree | a3254338492bb90ae7489943bbb9e5cdb584021f /bfd | |
parent | c761c4ee3f718cc350577a1cb4e49fb8cf16c8f3 (diff) | |
download | gdb-2955ec4c12dbffa517fe1d821e7c5d1f7dde5f8a.zip gdb-2955ec4c12dbffa517fe1d821e7c5d1f7dde5f8a.tar.gz gdb-2955ec4c12dbffa517fe1d821e7c5d1f7dde5f8a.tar.bz2 |
bfd/
2009-07-21 H.J. Lu <hongjiu.lu@intel.com>
PR ld/10426
* elflink.c (elf_link_add_object_symbols): Turn an IFUNC symbol
from a DSO into a normal FUNC symbol.
(elf_link_output_extsym): Turn an undefined IFUNC symbol into
a normal FUNC symbol.
ld/testsuite/
2009-07-21 H.J. Lu <hongjiu.lu@intel.com>
PR ld/10426
* ld-ifunc/ifunc.exp: Check test-1 and libtest-2.so. Updated.
* ld-ifunc/test-1.c: New.
* ld-ifunc/test-2.c: Likewise.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 8 | ||||
-rw-r--r-- | bfd/elflink.c | 32 |
2 files changed, 31 insertions, 9 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index c8f1d85..926e5d9 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,11 @@ +2009-07-21 H.J. Lu <hongjiu.lu@intel.com> + + PR ld/10426 + * elflink.c (elf_link_add_object_symbols): Turn an IFUNC symbol + from a DSO into a normal FUNC symbol. + (elf_link_output_extsym): Turn an undefined IFUNC symbol into + a normal FUNC symbol. + 2009-07-17 Chao-ying Fu <fu@mips.com> * elfxx-mips.c (LOAD_INTERLOCKS_P): New define. diff --git a/bfd/elflink.c b/bfd/elflink.c index 4d54add..f9b577c 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -4279,15 +4279,24 @@ error_free_dyn: if (ELF_ST_TYPE (isym->st_info) != STT_NOTYPE && (definition || h->type == STT_NOTYPE)) { - if (h->type != STT_NOTYPE - && h->type != ELF_ST_TYPE (isym->st_info) - && ! type_change_ok) - (*_bfd_error_handler) - (_("Warning: type of symbol `%s' changed" - " from %d to %d in %B"), - abfd, name, h->type, ELF_ST_TYPE (isym->st_info)); + unsigned int type = ELF_ST_TYPE (isym->st_info); + + /* Turn an IFUNC symbol from a DSO into a normal FUNC + symbol. */ + if (type == STT_GNU_IFUNC + && (abfd->flags & DYNAMIC) != 0) + type = STT_FUNC; - h->type = ELF_ST_TYPE (isym->st_info); + if (h->type != type) + { + if (h->type != STT_NOTYPE && ! type_change_ok) + (*_bfd_error_handler) + (_("Warning: type of symbol `%s' changed" + " from %d to %d in %B"), + abfd, name, h->type, type); + + h->type = type; + } } /* Merge st_other field. */ @@ -8683,12 +8692,17 @@ elf_link_output_extsym (struct elf_link_hash_entry *h, void *data) || ELF_ST_BIND (sym.st_info) == STB_WEAK)) { int bindtype; + unsigned int type = ELF_ST_TYPE (sym.st_info); + + /* Turn an undefined IFUNC symbol into a normal FUNC symbol. */ + if (type == STT_GNU_IFUNC) + type = STT_FUNC; if (h->ref_regular_nonweak) bindtype = STB_GLOBAL; else bindtype = STB_WEAK; - sym.st_info = ELF_ST_INFO (bindtype, ELF_ST_TYPE (sym.st_info)); + sym.st_info = ELF_ST_INFO (bindtype, type); } /* If this is a symbol defined in a dynamic library, don't use the |