diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2016-06-18 09:16:52 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2016-06-18 09:17:25 -0700 |
commit | 233cc9c13af8e8182d0ce5b306526b59f5b11f37 (patch) | |
tree | 6381519cd959d8a585cd640de586e6aab3ca715b /ld/testsuite/ld-ifunc | |
parent | 854594f5ce00381eb0ed57e3c7fa08b5971eabec (diff) | |
download | gdb-233cc9c13af8e8182d0ce5b306526b59f5b11f37.zip gdb-233cc9c13af8e8182d0ce5b306526b59f5b11f37.tar.gz gdb-233cc9c13af8e8182d0ce5b306526b59f5b11f37.tar.bz2 |
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.
Diffstat (limited to 'ld/testsuite/ld-ifunc')
25 files changed, 178 insertions, 69 deletions
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 <foo>: -[ ]*[a-f0-9]+: c3 ret +Disassembly of section .text: -0+80480b5 <bar>: -[ ]*[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 <foo>: + +[a-f0-9]+: c3 ret + +0+80480a1 <bar>: + +[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 <foo>: -[ ]*[a-f0-9]+: c3 retq +Disassembly of section .text: -0+400109 <bar>: -[ ]*[a-f0-9]+: c3 retq +0+4000c8 <__start>: + +[a-f0-9]+: ff 15 2a 00 20 00 callq \*0x20002a\(%rip\) # 6000f8 <bar\+0x200007> + +[a-f0-9]+: ff 25 24 00 20 00 jmpq \*0x200024\(%rip\) # 6000f8 <bar\+0x200007> + +[a-f0-9]+: 48 03 05 1d 00 20 00 add 0x20001d\(%rip\),%rax # 6000f8 <bar\+0x200007> + +[a-f0-9]+: 48 8b 05 16 00 20 00 mov 0x200016\(%rip\),%rax # 6000f8 <bar\+0x200007> + +[a-f0-9]+: 48 85 05 0f 00 20 00 test %rax,0x20000f\(%rip\) # 6000f8 <bar\+0x200007> + +[a-f0-9]+: 48 c7 c0 f1 00 40 00 mov \$0x4000f1,%rax + +0+4000f0 <foo>: + +[a-f0-9]+: c3 retq + +0+4000f1 <bar>: + +[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 <foo>: -[ ]*[a-f0-9]+: c3 ret +Disassembly of section .text: -0+80480b5 <bar>: -[ ]*[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 <foo>: + +[a-f0-9]+: c3 ret + +0+80480a1 <bar>: + +[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 <foo>: -[ ]*[a-f0-9]+: c3 retq +Disassembly of section .text: -0+400109 <bar>: -[ ]*[a-f0-9]+: c3 retq +0+4000c8 <__start>: + +[a-f0-9]+: ff 15 2a 00 20 00 callq \*0x20002a\(%rip\) # 6000f8 <bar\+0x200007> + +[a-f0-9]+: ff 25 24 00 20 00 jmpq \*0x200024\(%rip\) # 6000f8 <bar\+0x200007> + +[a-f0-9]+: 48 03 05 1d 00 20 00 add 0x20001d\(%rip\),%rax # 6000f8 <bar\+0x200007> + +[a-f0-9]+: 48 8b 05 16 00 20 00 mov 0x200016\(%rip\),%rax # 6000f8 <bar\+0x200007> + +[a-f0-9]+: 48 85 05 0f 00 20 00 test %rax,0x20000f\(%rip\) # 6000f8 <bar\+0x200007> + +[a-f0-9]+: 48 c7 c0 f1 00 40 00 mov \$0x4000f1,%rax + +0+4000f0 <foo>: + +[a-f0-9]+: c3 retq + +0+4000f1 <bar>: + +[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|) |