From 1f85278f1750261761fe5177ccd6b95633f50217 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Thu, 16 Jul 2009 14:23:12 +0000 Subject: [PATCH] bfd/ 2009-07-16 H.J. Lu * elf32-i386.c (elf_i386_relocate_section): Don't get local STT_GNU_IFUNC symbol for relocatable link. * elf64-x86-64.c (elf64_x86_64_relocate_section): Likewise. ld/testsuite/ 2009-07-16 H.J. Lu * ld-ifunc/ifunc-5r-local-i386.d: New. * ld-ifunc/ifunc-5r-local-x86-64.d: Likewise. --- bfd/ChangeLog | 6 ++++++ bfd/elf32-i386.c | 3 ++- bfd/elf64-x86-64.c | 3 ++- ld/testsuite/ChangeLog | 5 +++++ ld/testsuite/ld-ifunc/ifunc-5r-local-i386.d | 11 +++++++++++ ld/testsuite/ld-ifunc/ifunc-5r-local-x86-64.d | 10 ++++++++++ 6 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 ld/testsuite/ld-ifunc/ifunc-5r-local-i386.d create mode 100644 ld/testsuite/ld-ifunc/ifunc-5r-local-x86-64.d diff --git a/bfd/ChangeLog b/bfd/ChangeLog index c433df753e7..79a75d90323 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2009-07-16 H.J. Lu + + * elf32-i386.c (elf_i386_relocate_section): Don't get local + STT_GNU_IFUNC symbol for relocatable link. + * elf64-x86-64.c (elf64_x86_64_relocate_section): Likewise. + 2009-07-10 H.J. Lu * bfdio.c (bfd_iovec): Add comments for bmmap. diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index c86d00da170..868e9d4328f 100644 --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -2891,7 +2891,8 @@ elf_i386_relocate_section (bfd *output_bfd, break; } } - else if (ELF32_ST_TYPE (sym->st_info) == STT_GNU_IFUNC) + else if (!info->relocatable + && ELF32_ST_TYPE (sym->st_info) == STT_GNU_IFUNC) { /* Relocate against local STT_GNU_IFUNC symbol. */ h = elf_i386_get_local_sym_hash (htab, input_bfd, diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index 6e868b389df..718f07610a8 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -2612,7 +2612,8 @@ elf64_x86_64_relocate_section (bfd *output_bfd, struct bfd_link_info *info, &sec, rel); /* Relocate against local STT_GNU_IFUNC symbol. */ - if (ELF64_ST_TYPE (sym->st_info) == STT_GNU_IFUNC) + if (!info->relocatable + && ELF64_ST_TYPE (sym->st_info) == STT_GNU_IFUNC) { h = elf64_x86_64_get_local_sym_hash (htab, input_bfd, rel, FALSE); diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 1c00f3e9622..78ec4a8d54e 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-07-16 H.J. Lu + + * ld-ifunc/ifunc-5r-local-i386.d: New. + * ld-ifunc/ifunc-5r-local-x86-64.d: Likewise. + 2009-07-16 Nathan Sidwell * ld-arm/arm-target2.s: Add addend cases. diff --git a/ld/testsuite/ld-ifunc/ifunc-5r-local-i386.d b/ld/testsuite/ld-ifunc/ifunc-5r-local-i386.d new file mode 100644 index 00000000000..18e1295ef6b --- /dev/null +++ b/ld/testsuite/ld-ifunc/ifunc-5r-local-i386.d @@ -0,0 +1,11 @@ +#source: ifunc-5-local-i386.s +#ld: -r -m elf_i386 +#as: --32 +#readelf: -r --wide +#target: x86_64-*-* i?86-*-* + +Relocation section '.rel.text' at .* +[ ]+Offset[ ]+Info[ ]+Type[ ]+.* +[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_GOTPC[ ]+0+[ ]+_GLOBAL_OFFSET_TABLE_[ ]* +[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_PLT32[ ]+foo\(\)[ ]+foo[ ]* +[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_GOT32[ ]+foo\(\)[ ]+foo[ ]* diff --git a/ld/testsuite/ld-ifunc/ifunc-5r-local-x86-64.d b/ld/testsuite/ld-ifunc/ifunc-5r-local-x86-64.d new file mode 100644 index 00000000000..e9ad214c45b --- /dev/null +++ b/ld/testsuite/ld-ifunc/ifunc-5r-local-x86-64.d @@ -0,0 +1,10 @@ +#source: ifunc-5-local-x86-64.s +#as: --64 +#ld: -r -melf_x86_64 +#readelf: -r --wide +#target: x86_64-*-* + +Relocation section '.rela.text' at .* +[ ]+Offset[ ]+Info[ ]+Type[ ]+.* +[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_PLT32[ ]+foo\(\)[ ]+foo - 4 +[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_GOTPCREL[ ]+foo\(\)[ ]+foo - 4 -- 2.30.2