aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2009-07-21 21:37:26 +0000
committerH.J. Lu <hjl.tools@gmail.com>2009-07-21 21:37:26 +0000
commit2955ec4c12dbffa517fe1d821e7c5d1f7dde5f8a (patch)
treea3254338492bb90ae7489943bbb9e5cdb584021f /bfd
parentc761c4ee3f718cc350577a1cb4e49fb8cf16c8f3 (diff)
downloadgdb-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/ChangeLog8
-rw-r--r--bfd/elflink.c32
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