From 233cc9c13af8e8182d0ce5b306526b59f5b11f37 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Sat, 18 Jun 2016 09:16:52 -0700 Subject: Don't generate PLT for IFUNC GOT/pointer reference If a backend supports it, PLT entry isn't needed when all references to a STT_GNU_IFUNC symbols are done via GOT or static function pointers. For GOT entries, We generate dynamic R_*_GLOB_DAT relocations for preemptable symbols and R_*_IRELATIVE relocations for non-preemptable symbols to update them with real function address. For static pointer pointers, we generate dynamic pointer relocations and store them in: 1. .rel[a].ifunc section in PIC object. 2. .rel[a].got section in dynamic executable. 3. .rel[a].iplt section in static executable. We don't allocate GOT entry if it isn't used. bfd/ PR ld/20253 * elf-bfd.h (_bfd_elf_allocate_ifunc_dyn_relocs): Add an bfd_boolean argument. * elf-ifunc.c (_bfd_elf_create_ifunc_sections): Replace "shared object" with "PIC object" in comments. (_bfd_elf_allocate_ifunc_dyn_relocs): Updated. Replace "shared object" with "PIC object" in comments. Avoid PLT if requested. Generate dynamic relocations for non-GOT references. Make room for the special first entry in PLT and allocate PLT entry only for PLT and PC-relative references. Store dynamic GOT relocations in .rel[a].iplt section for static executables. If PLT isn't used, always use GOT for symbol value. Don't allocate GOT entry if it isn't used. * elf32-i386.c (elf_i386_check_relocs): Increment PLT reference count only in the code section. Allocate dynamic pointer relocation against STT_GNU_IFUNC symbol in the non-code section. (elf_i386_adjust_dynamic_symbol): Increment PLT reference count only for PC-relative references. (elf_i386_allocate_dynrelocs): Pass TRUE to _bfd_elf_allocate_ifunc_dyn_relocs. (elf_i386_relocate_section): Allow R_386_GOT32/R_386_GOT32X relocations against STT_GNU_IFUNC symbols without PLT. Generate dynamic pointer relocation against STT_GNU_IFUNC symbol in the non-code section and store it in the proper REL section. Don't allow non-pointer relocation against STT_GNU_IFUNC symbol without PLT. (elf_i386_finish_dynamic_symbol): Generate dynamic R_386_IRELATIVE and R_386_GLOB_DAT GOT relocations against STT_GNU_IFUNC symbols without PLT. (elf_i386_finish_dynamic_sections): Don't handle local STT_GNU_IFUNC symbols here. (elf_i386_output_arch_local_syms): Handle local STT_GNU_IFUNC symbols here. (elf_backend_output_arch_local_syms): New. * elf32-x86-64.c (elf_i386_check_relocs): Increment PLT reference count only in the code section. Allocate dynamic pointer relocation against STT_GNU_IFUNC symbol in the non-code section. (elf_x86_64_adjust_dynamic_symbol): Increment PLT reference count only for PC-relative references. (elf_x86_64_allocate_dynrelocs): Pass TRUE to _bfd_elf_allocate_ifunc_dyn_relocs. (elf_x86_64_relocate_section): Allow R_X86_64_GOTPCREL, R_X86_64_GOTPCRELX, R_X86_64_REX_GOTPCRELX and R_X86_64_GOTPCREL64 relocations against STT_GNU_IFUNC symbols without PLT. Generate dynamic pointer relocation against STT_GNU_IFUNC symbol in the non-code section and store it in the proper RELA section. Don't allow non-pointer relocation against STT_GNU_IFUNC symbol without PLT. (elf_x86_64_finish_dynamic_symbol): Generate dynamic R_X86_64_IRELATIVE and R_X86_64_GLOB_DAT GOT relocations against STT_GNU_IFUNC symbols without PLT. (elf_x86_64_finish_dynamic_sections): Don't handle local STT_GNU_IFUNC symbols here. (elf_x86_64_output_arch_local_syms): Handle local STT_GNU_IFUNC symbols here. (elf_backend_output_arch_local_syms): New. * elfnn-aarch64.c (elfNN_aarch64_allocate_ifunc_dynrelocs): Pass FALSE to _bfd_elf_allocate_ifunc_dyn_relocs. ld/ PR ld/20253 * testsuite/ld-i386/i386.exp: Run PR ld/20253 tests. * testsuite/ld-i386/no-plt.exp: Likewise. * testsuite/ld-x86-64/no-plt.exp: Likewise. * testsuite/ld-i386/pr13302.d: Remove .rel.plt section. * testsuite/ld-ifunc/ifunc-13-i386.d: Likewise. * testsuite/ld-ifunc/ifunc-13-x86-64.d: Likewise. * testsuite/ld-ifunc/ifunc-15-i386.d: Likewise. * testsuite/ld-ifunc/ifunc-15-x86-64.d: Likewise. * testsuite/ld-x86-64/pr13082-5a.d: Likewise. * testsuite/ld-x86-64/pr13082-5b.d: Likewise. * testsuite/ld-x86-64/pr13082-6a.d: Likewise. * testsuite/ld-x86-64/pr13082-6b.d: Likewise. * testsuite/ld-i386/pr20244-2a.d: Remove .plt section. * testsuite/ld-ifunc/ifunc-21-i386.d: Likewise. * testsuite/ld-ifunc/ifunc-21-x86-64.d: Likewise. * testsuite/ld-ifunc/ifunc-22-i386.d: Likewise. * testsuite/ld-ifunc/ifunc-22-x86-64.d: Likewise. * testsuite/ld-i386/pr20244-2b.d: Updated. * testsuite/ld-i386/pr20244-2c.d: Likewise. * testsuite/ld-ifunc/ifunc-18a-i386.d: Likewise. * testsuite/ld-ifunc/ifunc-18a-x86-64.d: Likewise. * testsuite/ld-ifunc/ifunc-18b-i386.d: Likewise. * testsuite/ld-ifunc/ifunc-18b-x86-64.d: Likewise. * testsuite/ld-i386/pr20253-1a.c: New file. * testsuite/ld-i386/pr20253-1b.S: Likewise. * testsuite/ld-i386/pr20253-1c.S: Likewise. * testsuite/ld-i386/pr20253-1d.S: Likewise. * testsuite/ld-i386/pr20253-2a.c: Likewise. * testsuite/ld-i386/pr20253-2b.S: Likewise. * testsuite/ld-i386/pr20253-2c.S: Likewise. * testsuite/ld-i386/pr20253-2d.S: Likewise. * testsuite/ld-i386/pr20253-3.d: Likewise. * testsuite/ld-i386/pr20253-3.s: Likewise. * testsuite/ld-i386/pr20253-4.s: Likewise. * testsuite/ld-i386/pr20253-4a.d: Likewise. * testsuite/ld-i386/pr20253-4b.d: Likewise. * testsuite/ld-i386/pr20253-4c.d: Likewise. * testsuite/ld-i386/pr20253-5.d: Likewise. * testsuite/ld-i386/pr20253-5.s: Likewise. * testsuite/ld-ifunc/ifunc-23-x86.s: Likewise. * testsuite/ld-ifunc/ifunc-23a-x86.d: Likewise. * testsuite/ld-ifunc/ifunc-23b-x86.d: Likewise. * testsuite/ld-ifunc/ifunc-23c-x86.d: Likewise. * testsuite/ld-ifunc/ifunc-24-x86.s: Likewise. * testsuite/ld-ifunc/ifunc-24a-x86.d: Likewise. * testsuite/ld-ifunc/ifunc-24b-x86.d: Likewise. * testsuite/ld-ifunc/ifunc-24c-x86.d: Likewise. * testsuite/ld-ifunc/ifunc-25-x86.s: Likewise. * testsuite/ld-ifunc/ifunc-25a-x86.d: Likewise. * testsuite/ld-ifunc/ifunc-25b-x86.d: Likewise. * testsuite/ld-ifunc/ifunc-25c-x86.d: Likewise. * testsuite/ld-x86-64/pr20253-1.s: Likewise. * testsuite/ld-x86-64/pr20253-1a.d: Likewise. * testsuite/ld-x86-64/pr20253-1b.d: Likewise. * testsuite/ld-x86-64/pr20253-1c.d: Likewise. * testsuite/ld-x86-64/pr20253-1d.d: Likewise. * testsuite/ld-x86-64/pr20253-1e.d: Likewise. * testsuite/ld-x86-64/pr20253-1f.d: Likewise. * testsuite/ld-x86-64/pr20253-1g.d: Likewise. * testsuite/ld-x86-64/pr20253-1h.d: Likewise. * testsuite/ld-x86-64/pr20253-1i.d: Likewise. * testsuite/ld-x86-64/pr20253-1j.d: Likewise. * testsuite/ld-x86-64/pr20253-1k.d: Likewise. * testsuite/ld-x86-64/pr20253-1l.d: Likewise. * testsuite/ld-x86-64/pr20253-2a.c: Likewise. * testsuite/ld-x86-64/pr20253-2b.S: Likewise. * testsuite/ld-x86-64/pr20253-2c.S: Likewise. * testsuite/ld-x86-64/pr20253-2d.S: Likewise. * testsuite/ld-x86-64/pr20253-3.d: Likewise. * testsuite/ld-x86-64/pr20253-3.s: Likewise. * testsuite/ld-x86-64/pr20253-4.s: Likewise. * testsuite/ld-x86-64/pr20253-4a.d: Likewise. * testsuite/ld-x86-64/pr20253-4b.d: Likewise. * testsuite/ld-x86-64/pr20253-4c.d: Likewise. * testsuite/ld-x86-64/pr20253-4d.d: Likewise. * testsuite/ld-x86-64/pr20253-4e.d: Likewise. * testsuite/ld-x86-64/pr20253-4f.d: Likewise. * testsuite/ld-x86-64/pr20253-5.s: Likewise. * testsuite/ld-x86-64/pr20253-5a.d: Likewise. * testsuite/ld-x86-64/pr20253-5b.d: Likewise. * testsuite/ld-ifunc/ifunc-18a-i386.d: Remove extra IRELATIVE relocation. * testsuite/ld-ifunc/ifunc-18a-x86-64.d: Likewise. * testsuite/ld-ifunc/ifunc-18b-i386.d: Likewise. * testsuite/ld-ifunc/ifunc-18b-x86-64.d: Likewise. * testsuite/ld-ifunc/ifunc-18a.s: Fix a typo. * testsuite/ld-x86-64/x86-64.exp: Run pr20253-1 tests. --- ld/testsuite/ld-ifunc/ifunc-13-i386.d | 4 ---- ld/testsuite/ld-ifunc/ifunc-13-x86-64.d | 4 ---- ld/testsuite/ld-ifunc/ifunc-15-i386.d | 4 ---- ld/testsuite/ld-ifunc/ifunc-15-x86-64.d | 4 ---- ld/testsuite/ld-ifunc/ifunc-18a-i386.d | 1 - ld/testsuite/ld-ifunc/ifunc-18a-x86-64.d | 1 - ld/testsuite/ld-ifunc/ifunc-18a.s | 2 +- ld/testsuite/ld-ifunc/ifunc-18b-i386.d | 1 - ld/testsuite/ld-ifunc/ifunc-18b-x86-64.d | 1 - ld/testsuite/ld-ifunc/ifunc-21-i386.d | 26 ++++++++++++++------------ ld/testsuite/ld-ifunc/ifunc-21-x86-64.d | 26 ++++++++++++++------------ ld/testsuite/ld-ifunc/ifunc-22-i386.d | 26 ++++++++++++++------------ ld/testsuite/ld-ifunc/ifunc-22-x86-64.d | 26 ++++++++++++++------------ ld/testsuite/ld-ifunc/ifunc-23-x86.s | 10 ++++++++++ ld/testsuite/ld-ifunc/ifunc-23a-x86.d | 8 ++++++++ ld/testsuite/ld-ifunc/ifunc-23b-x86.d | 8 ++++++++ ld/testsuite/ld-ifunc/ifunc-23c-x86.d | 8 ++++++++ ld/testsuite/ld-ifunc/ifunc-24-x86.s | 11 +++++++++++ ld/testsuite/ld-ifunc/ifunc-24a-x86.d | 8 ++++++++ ld/testsuite/ld-ifunc/ifunc-24b-x86.d | 12 ++++++++++++ ld/testsuite/ld-ifunc/ifunc-24c-x86.d | 12 ++++++++++++ ld/testsuite/ld-ifunc/ifunc-25-x86.s | 12 ++++++++++++ ld/testsuite/ld-ifunc/ifunc-25a-x86.d | 8 ++++++++ ld/testsuite/ld-ifunc/ifunc-25b-x86.d | 12 ++++++++++++ ld/testsuite/ld-ifunc/ifunc-25c-x86.d | 12 ++++++++++++ 25 files changed, 178 insertions(+), 69 deletions(-) create mode 100644 ld/testsuite/ld-ifunc/ifunc-23-x86.s create mode 100644 ld/testsuite/ld-ifunc/ifunc-23a-x86.d create mode 100644 ld/testsuite/ld-ifunc/ifunc-23b-x86.d create mode 100644 ld/testsuite/ld-ifunc/ifunc-23c-x86.d create mode 100644 ld/testsuite/ld-ifunc/ifunc-24-x86.s create mode 100644 ld/testsuite/ld-ifunc/ifunc-24a-x86.d create mode 100644 ld/testsuite/ld-ifunc/ifunc-24b-x86.d create mode 100644 ld/testsuite/ld-ifunc/ifunc-24c-x86.d create mode 100644 ld/testsuite/ld-ifunc/ifunc-25-x86.s create mode 100644 ld/testsuite/ld-ifunc/ifunc-25a-x86.d create mode 100644 ld/testsuite/ld-ifunc/ifunc-25b-x86.d create mode 100644 ld/testsuite/ld-ifunc/ifunc-25c-x86.d (limited to 'ld/testsuite/ld-ifunc') diff --git a/ld/testsuite/ld-ifunc/ifunc-13-i386.d b/ld/testsuite/ld-ifunc/ifunc-13-i386.d index 677fa92..8dd3fed 100644 --- a/ld/testsuite/ld-ifunc/ifunc-13-i386.d +++ b/ld/testsuite/ld-ifunc/ifunc-13-i386.d @@ -8,7 +8,3 @@ Relocation section '.rel.ifunc' at offset 0x[0-9a-f]+ contains 1 entries: [ ]+Offset[ ]+Info[ ]+Type[ ]+.* [0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_32[ ]+ifunc\(\)[ ]+ifunc - -Relocation section '.rel.plt' at offset 0x[0-9a-f]+ contains 1 entries: -[ ]+Offset[ ]+Info[ ]+Type[ ]+.* -[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_JUMP_SLOT[ ]+ifunc\(\)[ ]+ifunc diff --git a/ld/testsuite/ld-ifunc/ifunc-13-x86-64.d b/ld/testsuite/ld-ifunc/ifunc-13-x86-64.d index b01c735..1a1d061 100644 --- a/ld/testsuite/ld-ifunc/ifunc-13-x86-64.d +++ b/ld/testsuite/ld-ifunc/ifunc-13-x86-64.d @@ -8,7 +8,3 @@ Relocation section '.rela.ifunc' at offset 0x[0-9a-f]+ contains 1 entries: [ ]+Offset[ ]+Info[ ]+Type[ ]+.* [0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_64[ ]+ifunc\(\)[ ]+ifunc \+ 0 - -Relocation section '.rela.plt' at offset 0x[0-9a-f]+ contains 1 entries: -[ ]+Offset[ ]+Info[ ]+Type[ ]+.* -[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_JUMP_SLOT[ ]+ifunc\(\)[ ]+ifunc \+ 0 diff --git a/ld/testsuite/ld-ifunc/ifunc-15-i386.d b/ld/testsuite/ld-ifunc/ifunc-15-i386.d index c37dd51..0d44ba1 100644 --- a/ld/testsuite/ld-ifunc/ifunc-15-i386.d +++ b/ld/testsuite/ld-ifunc/ifunc-15-i386.d @@ -7,7 +7,3 @@ Relocation section '.rel.got' at offset 0x[0-9a-f]+ contains 1 entries: [ ]+Offset[ ]+Info[ ]+Type[ ]+.* [0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_GLOB_DAT[ ]+ifunc\(\)[ ]+ifunc - -Relocation section '.rel.plt' at offset 0x[0-9a-f]+ contains 1 entries: -[ ]+Offset[ ]+Info[ ]+Type[ ]+.* -[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_JUMP_SLOT[ ]+ifunc\(\)[ ]+ifunc diff --git a/ld/testsuite/ld-ifunc/ifunc-15-x86-64.d b/ld/testsuite/ld-ifunc/ifunc-15-x86-64.d index a4a5cb1..8a28ec9 100644 --- a/ld/testsuite/ld-ifunc/ifunc-15-x86-64.d +++ b/ld/testsuite/ld-ifunc/ifunc-15-x86-64.d @@ -7,7 +7,3 @@ Relocation section '.rela.got' at offset 0x[0-9a-f]+ contains 1 entries: [ ]+Offset[ ]+Info[ ]+Type[ ]+.* [0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_GLOB_DAT[ ]+ifunc\(\)[ ]+ifunc \+ 0 - -Relocation section '.rela.plt' at offset 0x[0-9a-f]+ contains 1 entries: -[ ]+Offset[ ]+Info[ ]+Type[ ]+.* -[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_JUMP_SLOT[ ]+ifunc\(\)[ ]+ifunc \+ 0 diff --git a/ld/testsuite/ld-ifunc/ifunc-18a-i386.d b/ld/testsuite/ld-ifunc/ifunc-18a-i386.d index 10490b1..7c392fb 100644 --- a/ld/testsuite/ld-ifunc/ifunc-18a-i386.d +++ b/ld/testsuite/ld-ifunc/ifunc-18a-i386.d @@ -12,4 +12,3 @@ Relocation section '.rel.ifunc' at .* Relocation section '.rel.plt' at .* [ ]+Offset[ ]+Info[ ]+Type[ ]+.* [0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_IRELATIVE[ ]* -[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_IRELATIVE[ ]* diff --git a/ld/testsuite/ld-ifunc/ifunc-18a-x86-64.d b/ld/testsuite/ld-ifunc/ifunc-18a-x86-64.d index 0d600eb..e9d6031 100644 --- a/ld/testsuite/ld-ifunc/ifunc-18a-x86-64.d +++ b/ld/testsuite/ld-ifunc/ifunc-18a-x86-64.d @@ -12,4 +12,3 @@ Relocation section '.rela.ifunc' at .* Relocation section '.rela.plt' at .* [ ]+Offset[ ]+Info[ ]+Type[ ]+.* [0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_IRELATIVE[ ]+[0-9a-f]* -[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_IRELATIVE[ ]+[0-9a-f]* diff --git a/ld/testsuite/ld-ifunc/ifunc-18a.s b/ld/testsuite/ld-ifunc/ifunc-18a.s index c29c121..f68c151 100644 --- a/ld/testsuite/ld-ifunc/ifunc-18a.s +++ b/ld/testsuite/ld-ifunc/ifunc-18a.s @@ -1,5 +1,5 @@ .section .data.rel,"aw",@progbits - .globl foo_ptrt + .globl foo_ptr .type foo_ptr, @object foo_ptr: .dc.a foo diff --git a/ld/testsuite/ld-ifunc/ifunc-18b-i386.d b/ld/testsuite/ld-ifunc/ifunc-18b-i386.d index a5eda94..4b63c57 100644 --- a/ld/testsuite/ld-ifunc/ifunc-18b-i386.d +++ b/ld/testsuite/ld-ifunc/ifunc-18b-i386.d @@ -12,4 +12,3 @@ Relocation section '.rel.ifunc' at .* Relocation section '.rel.plt' at .* [ ]+Offset[ ]+Info[ ]+Type[ ]+.* [0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_IRELATIVE[ ]* -[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_IRELATIVE[ ]* diff --git a/ld/testsuite/ld-ifunc/ifunc-18b-x86-64.d b/ld/testsuite/ld-ifunc/ifunc-18b-x86-64.d index 8dfebfb..b4ff6c3 100644 --- a/ld/testsuite/ld-ifunc/ifunc-18b-x86-64.d +++ b/ld/testsuite/ld-ifunc/ifunc-18b-x86-64.d @@ -12,4 +12,3 @@ Relocation section '.rela.ifunc' at .* Relocation section '.rela.plt' at .* [ ]+Offset[ ]+Info[ ]+Type[ ]+.* [0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_IRELATIVE[ ]+[0-9a-f]* -[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_IRELATIVE[ ]+[0-9a-f]* diff --git a/ld/testsuite/ld-ifunc/ifunc-21-i386.d b/ld/testsuite/ld-ifunc/ifunc-21-i386.d index e609dbe..d61ccd0 100644 --- a/ld/testsuite/ld-ifunc/ifunc-21-i386.d +++ b/ld/testsuite/ld-ifunc/ifunc-21-i386.d @@ -5,18 +5,20 @@ .*: +file format .* -#... -0+8048090 <__start>: -[ ]*[a-f0-9]+: ff 93 0c 00 00 00 call \*0xc\(%ebx\) -[ ]*[a-f0-9]+: ff a3 0c 00 00 00 jmp \*0xc\(%ebx\) -[ ]*[a-f0-9]+: 03 83 0c 00 00 00 add 0xc\(%ebx\),%eax -[ ]*[a-f0-9]+: 8b 83 0c 00 00 00 mov 0xc\(%ebx\),%eax -[ ]*[a-f0-9]+: 85 83 0c 00 00 00 test %eax,0xc\(%ebx\) -[ ]*[a-f0-9]+: c7 c0 b5 80 04 08 mov \$0x80480b5,%eax -0+80480b4 : -[ ]*[a-f0-9]+: c3 ret +Disassembly of section .text: -0+80480b5 : -[ ]*[a-f0-9]+: c3 ret +0+804807c <__start>: + +[a-f0-9]+: ff 93 fc ff ff ff call \*-0x4\(%ebx\) + +[a-f0-9]+: ff a3 fc ff ff ff jmp \*-0x4\(%ebx\) + +[a-f0-9]+: 03 83 fc ff ff ff add -0x4\(%ebx\),%eax + +[a-f0-9]+: 8b 83 fc ff ff ff mov -0x4\(%ebx\),%eax + +[a-f0-9]+: 85 83 fc ff ff ff test %eax,-0x4\(%ebx\) + +[a-f0-9]+: c7 c0 a1 80 04 08 mov \$0x80480a1,%eax + +0+80480a0 : + +[a-f0-9]+: c3 ret + +0+80480a1 : + +[a-f0-9]+: c3 ret #pass diff --git a/ld/testsuite/ld-ifunc/ifunc-21-x86-64.d b/ld/testsuite/ld-ifunc/ifunc-21-x86-64.d index e28734e..4e3582d 100644 --- a/ld/testsuite/ld-ifunc/ifunc-21-x86-64.d +++ b/ld/testsuite/ld-ifunc/ifunc-21-x86-64.d @@ -5,18 +5,20 @@ .*: +file format .* -#... -0+4000e0 <__start>: -[ ]*[a-f0-9]+: ff 15 42 00 20 00 callq \*0x200042\(%rip\) # 600128 <_GLOBAL_OFFSET_TABLE_\+0x18> -[ ]*[a-f0-9]+: ff 25 3c 00 20 00 jmpq \*0x20003c\(%rip\) # 600128 <_GLOBAL_OFFSET_TABLE_\+0x18> -[ ]*[a-f0-9]+: 48 03 05 35 00 20 00 add 0x200035\(%rip\),%rax # 600128 <_GLOBAL_OFFSET_TABLE_\+0x18> -[ ]*[a-f0-9]+: 48 8b 05 2e 00 20 00 mov 0x20002e\(%rip\),%rax # 600128 <_GLOBAL_OFFSET_TABLE_\+0x18> -[ ]*[a-f0-9]+: 48 85 05 27 00 20 00 test %rax,0x200027\(%rip\) # 600128 <_GLOBAL_OFFSET_TABLE_\+0x18> -[ ]*[a-f0-9]+: 48 c7 c0 09 01 40 00 mov \$0x400109,%rax -0+400108 : -[ ]*[a-f0-9]+: c3 retq +Disassembly of section .text: -0+400109 : -[ ]*[a-f0-9]+: c3 retq +0+4000c8 <__start>: + +[a-f0-9]+: ff 15 2a 00 20 00 callq \*0x20002a\(%rip\) # 6000f8 + +[a-f0-9]+: ff 25 24 00 20 00 jmpq \*0x200024\(%rip\) # 6000f8 + +[a-f0-9]+: 48 03 05 1d 00 20 00 add 0x20001d\(%rip\),%rax # 6000f8 + +[a-f0-9]+: 48 8b 05 16 00 20 00 mov 0x200016\(%rip\),%rax # 6000f8 + +[a-f0-9]+: 48 85 05 0f 00 20 00 test %rax,0x20000f\(%rip\) # 6000f8 + +[a-f0-9]+: 48 c7 c0 f1 00 40 00 mov \$0x4000f1,%rax + +0+4000f0 : + +[a-f0-9]+: c3 retq + +0+4000f1 : + +[a-f0-9]+: c3 retq #pass diff --git a/ld/testsuite/ld-ifunc/ifunc-22-i386.d b/ld/testsuite/ld-ifunc/ifunc-22-i386.d index e609dbe..d61ccd0 100644 --- a/ld/testsuite/ld-ifunc/ifunc-22-i386.d +++ b/ld/testsuite/ld-ifunc/ifunc-22-i386.d @@ -5,18 +5,20 @@ .*: +file format .* -#... -0+8048090 <__start>: -[ ]*[a-f0-9]+: ff 93 0c 00 00 00 call \*0xc\(%ebx\) -[ ]*[a-f0-9]+: ff a3 0c 00 00 00 jmp \*0xc\(%ebx\) -[ ]*[a-f0-9]+: 03 83 0c 00 00 00 add 0xc\(%ebx\),%eax -[ ]*[a-f0-9]+: 8b 83 0c 00 00 00 mov 0xc\(%ebx\),%eax -[ ]*[a-f0-9]+: 85 83 0c 00 00 00 test %eax,0xc\(%ebx\) -[ ]*[a-f0-9]+: c7 c0 b5 80 04 08 mov \$0x80480b5,%eax -0+80480b4 : -[ ]*[a-f0-9]+: c3 ret +Disassembly of section .text: -0+80480b5 : -[ ]*[a-f0-9]+: c3 ret +0+804807c <__start>: + +[a-f0-9]+: ff 93 fc ff ff ff call \*-0x4\(%ebx\) + +[a-f0-9]+: ff a3 fc ff ff ff jmp \*-0x4\(%ebx\) + +[a-f0-9]+: 03 83 fc ff ff ff add -0x4\(%ebx\),%eax + +[a-f0-9]+: 8b 83 fc ff ff ff mov -0x4\(%ebx\),%eax + +[a-f0-9]+: 85 83 fc ff ff ff test %eax,-0x4\(%ebx\) + +[a-f0-9]+: c7 c0 a1 80 04 08 mov \$0x80480a1,%eax + +0+80480a0 : + +[a-f0-9]+: c3 ret + +0+80480a1 : + +[a-f0-9]+: c3 ret #pass diff --git a/ld/testsuite/ld-ifunc/ifunc-22-x86-64.d b/ld/testsuite/ld-ifunc/ifunc-22-x86-64.d index e28734e..4e3582d 100644 --- a/ld/testsuite/ld-ifunc/ifunc-22-x86-64.d +++ b/ld/testsuite/ld-ifunc/ifunc-22-x86-64.d @@ -5,18 +5,20 @@ .*: +file format .* -#... -0+4000e0 <__start>: -[ ]*[a-f0-9]+: ff 15 42 00 20 00 callq \*0x200042\(%rip\) # 600128 <_GLOBAL_OFFSET_TABLE_\+0x18> -[ ]*[a-f0-9]+: ff 25 3c 00 20 00 jmpq \*0x20003c\(%rip\) # 600128 <_GLOBAL_OFFSET_TABLE_\+0x18> -[ ]*[a-f0-9]+: 48 03 05 35 00 20 00 add 0x200035\(%rip\),%rax # 600128 <_GLOBAL_OFFSET_TABLE_\+0x18> -[ ]*[a-f0-9]+: 48 8b 05 2e 00 20 00 mov 0x20002e\(%rip\),%rax # 600128 <_GLOBAL_OFFSET_TABLE_\+0x18> -[ ]*[a-f0-9]+: 48 85 05 27 00 20 00 test %rax,0x200027\(%rip\) # 600128 <_GLOBAL_OFFSET_TABLE_\+0x18> -[ ]*[a-f0-9]+: 48 c7 c0 09 01 40 00 mov \$0x400109,%rax -0+400108 : -[ ]*[a-f0-9]+: c3 retq +Disassembly of section .text: -0+400109 : -[ ]*[a-f0-9]+: c3 retq +0+4000c8 <__start>: + +[a-f0-9]+: ff 15 2a 00 20 00 callq \*0x20002a\(%rip\) # 6000f8 + +[a-f0-9]+: ff 25 24 00 20 00 jmpq \*0x200024\(%rip\) # 6000f8 + +[a-f0-9]+: 48 03 05 1d 00 20 00 add 0x20001d\(%rip\),%rax # 6000f8 + +[a-f0-9]+: 48 8b 05 16 00 20 00 mov 0x200016\(%rip\),%rax # 6000f8 + +[a-f0-9]+: 48 85 05 0f 00 20 00 test %rax,0x20000f\(%rip\) # 6000f8 + +[a-f0-9]+: 48 c7 c0 f1 00 40 00 mov \$0x4000f1,%rax + +0+4000f0 : + +[a-f0-9]+: c3 retq + +0+4000f1 : + +[a-f0-9]+: c3 retq #pass diff --git a/ld/testsuite/ld-ifunc/ifunc-23-x86.s b/ld/testsuite/ld-ifunc/ifunc-23-x86.s new file mode 100644 index 0000000..69c2279 --- /dev/null +++ b/ld/testsuite/ld-ifunc/ifunc-23-x86.s @@ -0,0 +1,10 @@ + .type foo,%gnu_indirect_function +foo: + ret + .globl _start +_start: + ret + .globl __start +__start: + .data + .dc.a foo diff --git a/ld/testsuite/ld-ifunc/ifunc-23a-x86.d b/ld/testsuite/ld-ifunc/ifunc-23a-x86.d new file mode 100644 index 0000000..47ec5d1 --- /dev/null +++ b/ld/testsuite/ld-ifunc/ifunc-23a-x86.d @@ -0,0 +1,8 @@ +#source: ifunc-23-x86.s +#ld: +#readelf: -r --wide +#target: x86_64-*-* i?86-*-* + +Relocation section '.rel(a|).plt' at offset 0x[0-9a-f]+ contains 1 entries: + +Offset +Info +Type +Sym.* Value +Symbol's Name.* +[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_(386|X86_64)+_IRELATIVE[ ]*[0-9a-f]* diff --git a/ld/testsuite/ld-ifunc/ifunc-23b-x86.d b/ld/testsuite/ld-ifunc/ifunc-23b-x86.d new file mode 100644 index 0000000..dbe2ec1 --- /dev/null +++ b/ld/testsuite/ld-ifunc/ifunc-23b-x86.d @@ -0,0 +1,8 @@ +#source: ifunc-23-x86.s +#ld: -pie +#readelf: -r --wide +#target: x86_64-*-* i?86-*-* + +Relocation section '.rel(a|).dyn' at offset 0x[0-9a-f]+ contains 1 entries: + +Offset +Info +Type +Sym.* Value +Symbol's Name.* +[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_(386|X86_64)+_IRELATIVE[ ]*[0-9a-f]* diff --git a/ld/testsuite/ld-ifunc/ifunc-23c-x86.d b/ld/testsuite/ld-ifunc/ifunc-23c-x86.d new file mode 100644 index 0000000..dc7e5c1 --- /dev/null +++ b/ld/testsuite/ld-ifunc/ifunc-23c-x86.d @@ -0,0 +1,8 @@ +#source: ifunc-23-x86.s +#ld: -shared +#readelf: -r --wide +#target: x86_64-*-* i?86-*-* + +Relocation section '.rel(a|).dyn' at offset 0x[0-9a-f]+ contains 1 entries: + +Offset +Info +Type +Sym.* Value +Symbol's Name.* +[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_(386|X86_64)+_IRELATIVE[ ]*[0-9a-f]* diff --git a/ld/testsuite/ld-ifunc/ifunc-24-x86.s b/ld/testsuite/ld-ifunc/ifunc-24-x86.s new file mode 100644 index 0000000..967cdf6 --- /dev/null +++ b/ld/testsuite/ld-ifunc/ifunc-24-x86.s @@ -0,0 +1,11 @@ + .text + .type foo,%gnu_indirect_function +foo: + ret + .globl _start +_start: + call foo@PLT + .globl __start +__start: + .data + .dc.a foo diff --git a/ld/testsuite/ld-ifunc/ifunc-24a-x86.d b/ld/testsuite/ld-ifunc/ifunc-24a-x86.d new file mode 100644 index 0000000..78bd4e2 --- /dev/null +++ b/ld/testsuite/ld-ifunc/ifunc-24a-x86.d @@ -0,0 +1,8 @@ +#source: ifunc-24-x86.s +#ld: +#readelf: -r --wide +#target: x86_64-*-* i?86-*-* + +Relocation section '.rel(a|).plt' at offset 0x[0-9a-f]+ contains 1 entries: + +Offset +Info +Type +Sym.* Value +Symbol's Name.* +[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_(386|X86_64)+_IRELATIVE[ ]*[0-9a-f]* diff --git a/ld/testsuite/ld-ifunc/ifunc-24b-x86.d b/ld/testsuite/ld-ifunc/ifunc-24b-x86.d new file mode 100644 index 0000000..c73b019 --- /dev/null +++ b/ld/testsuite/ld-ifunc/ifunc-24b-x86.d @@ -0,0 +1,12 @@ +#source: ifunc-24-x86.s +#ld: -pie +#readelf: -r --wide +#target: x86_64-*-* i?86-*-* + +Relocation section '.rel(a|).dyn' at offset 0x[0-9a-f]+ contains 1 entries: + +Offset +Info +Type +Sym.* Value +Symbol's Name.* +[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_(386|X86_64)+_IRELATIVE[ ]*[0-9a-f]* + +Relocation section '.rel(a|).plt' at offset 0x[0-9a-f]+ contains 1 entries: + +Offset +Info +Type +Sym.* Value +Symbol's Name.* +[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_(386|X86_64)+_IRELATIVE[ ]*[0-9a-f]* diff --git a/ld/testsuite/ld-ifunc/ifunc-24c-x86.d b/ld/testsuite/ld-ifunc/ifunc-24c-x86.d new file mode 100644 index 0000000..db16754 --- /dev/null +++ b/ld/testsuite/ld-ifunc/ifunc-24c-x86.d @@ -0,0 +1,12 @@ +#source: ifunc-24-x86.s +#ld: -shared +#readelf: -r --wide +#target: x86_64-*-* i?86-*-* + +Relocation section '.rel(a|).dyn' at offset 0x[0-9a-f]+ contains 1 entries: + +Offset +Info +Type +Sym.* Value +Symbol's Name.* +[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_(386|X86_64)+_IRELATIVE[ ]*[0-9a-f]* + +Relocation section '.rel(a|).plt' at offset 0x[0-9a-f]+ contains 1 entries: + +Offset +Info +Type +Sym.* Value +Symbol's Name.* +[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_(386|X86_64)+_IRELATIVE[ ]*[0-9a-f]* diff --git a/ld/testsuite/ld-ifunc/ifunc-25-x86.s b/ld/testsuite/ld-ifunc/ifunc-25-x86.s new file mode 100644 index 0000000..0549cbf --- /dev/null +++ b/ld/testsuite/ld-ifunc/ifunc-25-x86.s @@ -0,0 +1,12 @@ + .text + .globl foo + .type foo,%gnu_indirect_function +foo: + ret + .globl _start +_start: + call foo@PLT + .globl __start +__start: + .data + .dc.a foo diff --git a/ld/testsuite/ld-ifunc/ifunc-25a-x86.d b/ld/testsuite/ld-ifunc/ifunc-25a-x86.d new file mode 100644 index 0000000..0f37f52 --- /dev/null +++ b/ld/testsuite/ld-ifunc/ifunc-25a-x86.d @@ -0,0 +1,8 @@ +#source: ifunc-25-x86.s +#ld: +#readelf: -r --wide +#target: x86_64-*-* i?86-*-* + +Relocation section '.rel(a|).plt' at offset 0x[0-9a-f]+ contains 1 entries: + +Offset +Info +Type +Sym.* Value +Symbol's Name.* +[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_(386|X86_64)+_IRELATIVE[ ]*[0-9a-f]* diff --git a/ld/testsuite/ld-ifunc/ifunc-25b-x86.d b/ld/testsuite/ld-ifunc/ifunc-25b-x86.d new file mode 100644 index 0000000..96b0ed5 --- /dev/null +++ b/ld/testsuite/ld-ifunc/ifunc-25b-x86.d @@ -0,0 +1,12 @@ +#source: ifunc-25-x86.s +#ld: -pie +#readelf: -r --wide +#target: x86_64-*-* i?86-*-* + +Relocation section '.rel(a|).dyn' at offset 0x[0-9a-f]+ contains 1 entries: + +Offset +Info +Type +Sym.* Value +Symbol's Name.* +[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_(386|X86_64)+_IRELATIVE[ ]*[0-9a-f]* + +Relocation section '.rel(a|).plt' at offset 0x[0-9a-f]+ contains 1 entries: + +Offset +Info +Type +Sym.* Value +Symbol's Name.* +[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_(386|X86_64)+_IRELATIVE[ ]*[0-9a-f]* diff --git a/ld/testsuite/ld-ifunc/ifunc-25c-x86.d b/ld/testsuite/ld-ifunc/ifunc-25c-x86.d new file mode 100644 index 0000000..f9c08dc --- /dev/null +++ b/ld/testsuite/ld-ifunc/ifunc-25c-x86.d @@ -0,0 +1,12 @@ +#source: ifunc-25-x86.s +#ld: -shared +#readelf: -r --wide +#target: x86_64-*-* i?86-*-* + +Relocation section '.rel(a|).dyn' at offset 0x[0-9a-f]+ contains 1 entries: + +Offset +Info +Type +Sym.* Value +Symbol's Name.* +[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_(386|X86_64)_(32|64) +foo\(\) +foo( \+ 0|) + +Relocation section '.rel(a|).plt' at offset 0x[0-9a-f]+ contains 1 entries: + +Offset +Info +Type +Sym.* Value +Symbol's Name.* +[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_(386|X86_64)_JUMP_SLOT +foo\(\) +foo( \+ 0|) -- cgit v1.1