URL
https://opencores.org/ocsvn/open8_urisc/open8_urisc/trunk
Subversion Repositories open8_urisc
Compare Revisions
- This comparison shows the changes necessary to convert path
/open8_urisc/trunk/gnu/binutils/ld/testsuite
- from Rev 68 to Rev 70
- ↔ Reverse comparison
Rev 68 → Rev 70
/ld-ifunc/ifunc-5-x86-64.s
0,0 → 1,19
.text |
.type foo, %gnu_indirect_function |
.globl foo |
.type foo, @function |
foo: |
ret |
.size foo, .-foo |
.type start,"function" |
.global start |
start: |
.type _start,"function" |
.global _start |
_start: |
.type __start,"function" |
.global __start |
__start: |
.type __start,"function" |
call foo@PLT |
movq foo@GOTPCREL(%rip), %rax |
/ld-ifunc/ifunc-4-local-x86.s
0,0 → 1,18
.text |
.type foo, %gnu_indirect_function |
.type foo, @function |
foo: |
ret |
.size foo, .-foo |
.type start,"function" |
.global start |
start: |
.type _start,"function" |
.global _start |
_start: |
.type __start,"function" |
.global __start |
__start: |
.type __start,"function" |
call foo |
movl $foo,%eax |
/ld-ifunc/ifunc-14-x86-64.d
0,0 → 1,11
#source: ifunc-14a.s |
#source: ifunc-14b.s |
#ld: -shared -m elf_x86_64 -z nocombreloc |
#as: --64 |
#readelf: -d |
#target: x86_64-*-* |
|
#failif |
#... |
.*\(TEXTREL\).* |
#... |
/ld-ifunc/ifunc-14b.s
0,0 → 1,5
.type foo, %gnu_indirect_function |
.globl foo |
foo: |
ret |
.size foo, .-foo |
/ld-ifunc/ifunc-2-i386.s
0,0 → 1,21
.type foo, %gnu_indirect_function |
.global __GI_foo |
.hidden __GI_foo |
.set __GI_foo, foo |
.text |
.globl foo |
.type foo, @function |
foo: |
ret |
.size foo, .-foo |
.globl bar |
.type bar, @function |
bar: |
call .L6 |
.L6: |
popl %ebx |
addl $_GLOBAL_OFFSET_TABLE_+[.-.L6], %ebx |
call __GI_foo |
leal __GI_foo@GOTOFF(%ebx), %eax |
ret |
.size bar, .-bar |
/ld-ifunc/ifunc-5b-local-x86-64.d
0,0 → 1,9
#source: ifunc-5-local-x86-64.s |
#as: --64 |
#ld: -melf_x86_64 -shared -z nocombreloc |
#readelf: -r --wide |
#target: x86_64-*-* |
|
Relocation section '.rela.plt' at .* |
[ ]+Offset[ ]+Info[ ]+Type[ ]+.* |
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_IRELATIVE[ ]+[0-9a-f]* |
/ld-ifunc/ifunc-11-i386.d
0,0 → 1,6
#ld: -m elf_i386 -e bar --gc-sections |
#as: --32 |
#readelf: -r --wide |
#target: x86_64-*-* i?86-*-* |
|
There are no relocations in this file. |
/ld-ifunc/ifunc-10-x86-64.s
0,0 → 1,25
.section .text.foo,"ax",@progbits |
.type foo, @function |
foo: |
.global foo |
movl ifunc@GOTPCREL(%rip), %eax |
movl ifunc(%rip), %eax |
call ifunc@PLT |
call ifunc |
movl xxx(%rip), %eax |
ret |
|
.section .text.bar,"ax",@progbits |
.type bar, @function |
bar: |
.global bar |
ret |
|
.section .text.ifunc,"ax",@progbits |
.type ifunc, @gnu_indirect_function |
ifunc: |
ret |
|
.section .data.foo,"aw",@progbits |
xxx: |
.quad ifunc |
/ld-ifunc/ifunc-6-i386.s
0,0 → 1,24
.text |
.type foo, %gnu_indirect_function |
.globl foo |
.type foo, @function |
foo: |
ret |
.size foo, .-foo |
.protected foo |
.type start,"function" |
.global start |
start: |
.type _start,"function" |
.global _start |
_start: |
.type __start,"function" |
.global __start |
__start: |
.type __start,"function" |
call .L6 |
.L6: |
popl %ebx |
addl $_GLOBAL_OFFSET_TABLE_+[.-.L6], %ebx |
call foo@PLT |
leal foo@GOT(%ebx), %eax |
/ld-ifunc/ifunc-2-x86-64.d
0,0 → 1,9
#as: --64 |
#ld: -shared -melf_x86_64 |
#objdump: -dw |
#target: x86_64-*-* |
|
#... |
[ \t0-9a-f]+:[ \t0-9a-f]+call[ \t0-9a-fq]+<\*ABS\*\+0x220@plt> |
[ \t0-9a-f]+:[ \t0-9a-f]+lea[ \t]+.*\(%rip\),%rax.*[ \t0-9a-fq]+<\*ABS\*\+0x220@plt> |
#pass |
/ld-ifunc/ifunc-6a-x86-64.d
0,0 → 1,9
#source: ifunc-6-x86-64.s |
#as: --64 |
#ld: -melf_x86_64 |
#readelf: -r --wide |
#target: x86_64-*-* |
|
Relocation section '.rela.plt' at .* |
[ ]+Offset[ ]+Info[ ]+Type[ ]+.* |
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_IRELATIVE[ ]+[0-9a-f]* |
/ld-ifunc/ifunc-5a-local-i386.d
0,0 → 1,9
#source: ifunc-5-local-i386.s |
#ld: -m elf_i386 |
#as: --32 |
#readelf: -r --wide |
#target: x86_64-*-* i?86-*-* |
|
Relocation section '.rel.plt' at .* |
[ ]+Offset[ ]+Info[ ]+Type[ ]+.* |
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_IRELATIVE[ ]* |
/ld-ifunc/ifunc-5-local-x86-64.s
0,0 → 1,18
.text |
.type foo, %gnu_indirect_function |
.type foo, @function |
foo: |
ret |
.size foo, .-foo |
.type start,"function" |
.global start |
start: |
.type _start,"function" |
.global _start |
_start: |
.type __start,"function" |
.global __start |
__start: |
.type __start,"function" |
call foo@PLT |
movq foo@GOTPCREL(%rip), %rax |
/ld-ifunc/ifunc-4-x86.d
0,0 → 1,7
#ld: |
#readelf: -r --wide |
#target: x86_64-*-* i?86-*-* |
|
#... |
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_[_0-9A-Z]+_IRELATIVE[ ]*[0-9a-f]* |
#pass |
/ld-ifunc/ifunc-3a-x86.d
0,0 → 1,8
#source: ifunc-3-x86.s |
#ld: -shared |
#objdump: -dw |
#target: x86_64-*-* i?86-*-* |
|
#... |
[ \t0-9a-f]+:[ \t0-9a-f]+call[ \t0-9a-fq]+<\*ABS\*(\+0x258|)@plt> |
#pass |
/ld-ifunc/ifunc-11-i386.s
0,0 → 1,27
.section .text.foo,"ax",@progbits |
.type foo, @function |
foo: |
.global foo |
movl ifunc@GOT(%ecx), %eax |
movl ifunc@GOTOFF(%ecx), %eax |
call ifunc@PLT |
call ifunc |
movl xxx@GOT(%ecx), %eax |
movl xxx, %eax |
ret |
|
.section .text.bar,"ax",@progbits |
.type bar, @function |
bar: |
.global bar |
ret |
|
.section .text.ifunc,"ax",@progbits |
.type ifunc, @gnu_indirect_function |
.global ifunc |
ifunc: |
ret |
|
.section .data.foo,"aw",@progbits |
xxx: |
.long ifunc |
/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 |
/ld-ifunc/ifunc-2-x86-64.s
0,0 → 1,17
.type foo, %gnu_indirect_function |
.global __GI_foo |
.hidden __GI_foo |
.set __GI_foo, foo |
.text |
.globl foo |
.type foo, @function |
foo: |
ret |
.size foo, .-foo |
.globl bar |
.type bar, @function |
bar: |
call __GI_foo |
leaq __GI_foo(%rip), %rax |
ret |
.size bar, .-bar |
/ld-ifunc/ifunc-11-x86-64.d
0,0 → 1,6
#ld: -m elf_x86_64 -e bar --gc-sections |
#as: --64 |
#readelf: -r --wide |
#target: x86_64-*-* |
|
There are no relocations in this file. |
/ld-ifunc/ifunc-5b-i386.d
0,0 → 1,13
#source: ifunc-5-i386.s |
#ld: -shared -m elf_i386 -z nocombreloc |
#as: --32 |
#readelf: -r --wide |
#target: x86_64-*-* i?86-*-* |
|
Relocation section '.rel.got' at .* |
[ ]+Offset[ ]+Info[ ]+Type[ ]+.* |
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_GLOB_DAT[ ]+foo\(\)[ ]+foo |
#... |
Relocation section '.rel.plt' at .* |
[ ]+Offset[ ]+Info[ ]+Type[ ]+.* |
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_JUMP_SLOT[ ]+foo\(\)[ ]+foo |
/ld-ifunc/ifunc-6b-i386.d
0,0 → 1,13
#source: ifunc-6-i386.s |
#ld: -shared -m elf_i386 -z nocombreloc |
#as: --32 |
#readelf: -r --wide |
#target: x86_64-*-* i?86-*-* |
|
Relocation section '.rel.got' at .* |
[ ]+Offset[ ]+Info[ ]+Type[ ]+.* |
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_GLOB_DAT[ ]+foo\(\)[ ]+foo |
#... |
Relocation section '.rel.plt' at .* |
[ ]+Offset[ ]+Info[ ]+Type[ ]+.* |
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_IRELATIVE[ ]* |
/ld-ifunc/ifunc-6-x86-64.s
0,0 → 1,20
.text |
.type foo, %gnu_indirect_function |
.globl foo |
.type foo, @function |
foo: |
ret |
.size foo, .-foo |
.protected foo |
.type start,"function" |
.global start |
start: |
.type _start,"function" |
.global _start |
_start: |
.type __start,"function" |
.global __start |
__start: |
.type __start,"function" |
call foo@PLT |
movq foo@GOTPCREL(%rip), %rax |
/ld-ifunc/ifunc-7b-i386.d
0,0 → 1,9
#source: ifunc-7-i386.s |
#ld: -shared -m elf_i386 |
#as: --32 |
#readelf: -r --wide |
#target: x86_64-*-* i?86-*-* |
|
Relocation section '.rel.plt' at .* |
[ ]+Offset[ ]+Info[ ]+Type[ ]+.* |
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_IRELATIVE[ ]* |
/ld-ifunc/ifunc-8a-x86-64.s
0,0 → 1,12
.text |
.type start,"function" |
.global start |
start: |
.type _start,"function" |
.global _start |
_start: |
.type __start,"function" |
.global __start |
__start: |
.type __start,"function" |
movq foo@GOTPCREL(%rip), %rax |
/ld-ifunc/ifunc-4-x86.s
0,0 → 1,19
.text |
.type foo, %gnu_indirect_function |
.globl foo |
.type foo, @function |
foo: |
ret |
.size foo, .-foo |
.type start,"function" |
.global start |
start: |
.type _start,"function" |
.global _start |
_start: |
.type __start,"function" |
.global __start |
__start: |
.type __start,"function" |
call foo |
movl $foo,%eax |
/ld-ifunc/ifunc-5a-local-x86-64.d
0,0 → 1,9
#source: ifunc-5-local-x86-64.s |
#as: --64 |
#ld: -melf_x86_64 |
#readelf: -r --wide |
#target: x86_64-*-* |
|
Relocation section '.rela.plt' at .* |
[ ]+Offset[ ]+Info[ ]+Type[ ]+.* |
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_IRELATIVE[ ]+[0-9a-f]* |
/ld-ifunc/ifunc-10-i386.d
0,0 → 1,6
#ld: -m elf_i386 -e bar --gc-sections |
#as: --32 |
#readelf: -r --wide |
#target: x86_64-*-* i?86-*-* |
|
There are no relocations in this file. |
/ld-ifunc/ifunc-5-i386.s
0,0 → 1,23
.text |
.type foo, %gnu_indirect_function |
.globl foo |
.type foo, @function |
foo: |
ret |
.size foo, .-foo |
.type start,"function" |
.global start |
start: |
.type _start,"function" |
.global _start |
_start: |
.type __start,"function" |
.global __start |
__start: |
.type __start,"function" |
call .L6 |
.L6: |
popl %ebx |
addl $_GLOBAL_OFFSET_TABLE_+[.-.L6], %ebx |
call foo@PLT |
leal foo@GOT(%ebx), %eax |
/ld-ifunc/ifunc-11-x86-64.s
0,0 → 1,26
.section .text.foo,"ax",@progbits |
.type foo, @function |
foo: |
.global foo |
movl ifunc@GOTPCREL(%rip), %eax |
movl ifunc(%rip), %eax |
call ifunc@PLT |
call ifunc |
movl xxx(%rip), %eax |
ret |
|
.section .text.bar,"ax",@progbits |
.type bar, @function |
bar: |
.global bar |
ret |
|
.section .text.ifunc,"ax",@progbits |
.type ifunc, @gnu_indirect_function |
.global ifunc |
ifunc: |
ret |
|
.section .data.foo,"aw",@progbits |
xxx: |
.quad ifunc |
/ld-ifunc/test-1.c
0,0 → 1,3
extern int library_func2 (void); |
int (*fn) (void) = library_func2; |
int main (void) { fn (); return 0; } |
/ld-ifunc/ifunc-14-i386.d
0,0 → 1,11
#source: ifunc-14a.s |
#source: ifunc-14b.s |
#ld: -shared -m elf_i386 -z nocombreloc |
#as: --32 |
#readelf: -d --wide |
#target: x86_64-*-* i?86-*-* |
|
#failif |
#... |
.*\(TEXTREL\).* |
#... |
/ld-ifunc/ifunc-13a-x86-64.s
0,0 → 1,10
.text |
.type foo, @function |
.global |
foo: |
movl xxx(%rip), %eax |
ret |
|
.data |
xxx: |
.quad ifunc |
/ld-ifunc/ifunc-8b-i386.s
0,0 → 1,7
.text |
.type foo, %gnu_indirect_function |
.globl foo |
.type foo, @function |
foo: |
ret |
.size foo, .-foo |
/ld-ifunc/ifunc-6b-x86-64.d
0,0 → 1,13
#source: ifunc-6-x86-64.s |
#as: --64 |
#ld: -melf_x86_64 -shared -z nocombreloc |
#readelf: -r --wide |
#target: x86_64-*-* |
|
Relocation section '.rela.got' at .* |
[ ]+Offset[ ]+Info[ ]+Type[ ]+.* |
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_GLOB_DAT[ ]+foo\(\)[ ]+foo \+ 0 |
#... |
Relocation section '.rela.plt' at .* |
[ ]+Offset[ ]+Info[ ]+Type[ ]+.* |
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_IRELATIVE[ ]+[0-9a-f]* |
/ld-ifunc/ifunc-5b-local-i386.d
0,0 → 1,9
#source: ifunc-5-local-i386.s |
#ld: -shared -m elf_i386 -z nocombreloc |
#as: --32 |
#readelf: -r --wide |
#target: x86_64-*-* i?86-*-* |
|
Relocation section '.rel.plt' at .* |
[ ]+Offset[ ]+Info[ ]+Type[ ]+.* |
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_IRELATIVE[ ]* |
/ld-ifunc/ifunc-10-i386.s
0,0 → 1,26
.section .text.foo,"ax",@progbits |
.type foo, @function |
foo: |
.global foo |
movl ifunc@GOT(%ecx), %eax |
movl ifunc@GOTOFF(%ecx), %eax |
call ifunc@PLT |
call ifunc |
movl xxx@GOT(%ecx), %eax |
movl xxx, %eax |
ret |
|
.section .text.bar,"ax",@progbits |
.type bar, @function |
bar: |
.global bar |
ret |
|
.section .text.ifunc,"ax",@progbits |
.type ifunc, @gnu_indirect_function |
ifunc: |
ret |
|
.section .data.foo,"aw",@progbits |
xxx: |
.long ifunc |
/ld-ifunc/ifunc-13b-i386.s
0,0 → 1,5
.text |
.type ifunc, @gnu_indirect_function |
.globl ifunc |
ifunc: |
ret |
/ld-ifunc/ifunc-5a-i386.d
0,0 → 1,9
#source: ifunc-5-i386.s |
#ld: -m elf_i386 |
#as: --32 |
#readelf: -r --wide |
#target: x86_64-*-* i?86-*-* |
|
Relocation section '.rel.plt' at .* |
[ ]+Offset[ ]+Info[ ]+Type[ ]+.* |
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_IRELATIVE[ ]* |
/ld-ifunc/ifunc-12-x86-64.d
0,0 → 1,6
#ld: -shared -m elf_x86_64 -e bar --gc-sections |
#as: --64 |
#readelf: -r --wide |
#target: x86_64-*-* |
|
There are no relocations in this file. |
/ld-ifunc/ifunc-6a-i386.d
0,0 → 1,9
#source: ifunc-6-i386.s |
#ld: -m elf_i386 |
#as: --32 |
#readelf: -r --wide |
#target: x86_64-*-* i?86-*-* |
|
Relocation section '.rel.plt' at .* |
[ ]+Offset[ ]+Info[ ]+Type[ ]+.* |
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_IRELATIVE[ ]* |
/ld-ifunc/ifunc-7a-i386.d
0,0 → 1,9
#source: ifunc-7-i386.s |
#ld: -m elf_i386 |
#as: --32 |
#readelf: -r --wide |
#target: x86_64-*-* i?86-*-* |
|
Relocation section '.rel.plt' at .* |
[ ]+Offset[ ]+Info[ ]+Type[ ]+.* |
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_IRELATIVE[ ]* |
/ld-ifunc/ifunc-8-i386.d
0,0 → 1,10
#source: ifunc-8a-i386.s |
#source: ifunc-8b-i386.s |
#ld: -m elf_i386 |
#as: --32 |
#readelf: -r --wide |
#target: x86_64-*-* i?86-*-* |
|
Relocation section '.rel.plt' at .* |
[ ]+Offset[ ]+Info[ ]+Type[ ]+.* |
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_IRELATIVE[ ]* |
/ld-ifunc/ifunc-7-x86-64.s
0,0 → 1,20
.text |
.type foo, %gnu_indirect_function |
.globl foo |
.type foo, @function |
foo: |
ret |
.size foo, .-foo |
.hidden foo |
.type start,"function" |
.global start |
start: |
.type _start,"function" |
.global _start |
_start: |
.type __start,"function" |
.global __start |
__start: |
.type __start,"function" |
call foo@PLT |
movq foo@GOTPCREL(%rip), %rax |
/ld-ifunc/ifunc-5-local-i386.s
0,0 → 1,22
.text |
.type foo, %gnu_indirect_function |
.type foo, @function |
foo: |
ret |
.size foo, .-foo |
.type start,"function" |
.global start |
start: |
.type _start,"function" |
.global _start |
_start: |
.type __start,"function" |
.global __start |
__start: |
.type __start,"function" |
call .L6 |
.L6: |
popl %ebx |
addl $_GLOBAL_OFFSET_TABLE_+[.-.L6], %ebx |
call foo@PLT |
leal foo@GOT(%ebx), %eax |
/ld-ifunc/ifunc-8b-x86-64.s
0,0 → 1,7
.text |
.type foo, %gnu_indirect_function |
.globl foo |
.type foo, @function |
foo: |
ret |
.size foo, .-foo |
/ld-ifunc/ifunc-14a.s
0,0 → 1,7
.text |
.globl bar |
.type bar, @function |
bar: |
jmp foo |
.size bar, .-bar |
.hidden foo |
/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[ ]* |
/ld-ifunc/ifunc-13-i386.d
0,0 → 1,19
#source: ifunc-13a-i386.s |
#source: ifunc-13b-i386.s |
#ld: -shared -m elf_i386 -z nocombreloc |
#as: --32 |
#readelf: -r --wide |
#target: x86_64-*-* i?86-*-* |
|
Relocation section '.rel.got' at .* |
[ ]+Offset[ ]+Info[ ]+Type[ ]+.* |
#... |
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_GLOB_DAT[ ]+ifunc\(\)[ ]+ifunc |
#... |
Relocation section '.rel.ifunc' at .* |
[ ]+Offset[ ]+Info[ ]+Type[ ]+.* |
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_32[ ]+ifunc\(\)[ ]+ifunc |
#... |
Relocation section '.rel.plt' at .* |
[ ]+Offset[ ]+Info[ ]+Type[ ]+.* |
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_386_JUMP_SLOT[ ]+ifunc\(\)[ ]+ifunc |
/ld-ifunc/ifunc-12-x86-64.s
0,0 → 1,24
.section .text.foo,"ax",@progbits |
.type foo, @function |
foo: |
movl ifunc@GOTPCREL(%rip), %eax |
movl ifunc(%rip), %eax |
call ifunc@PLT |
call ifunc |
movl xxx(%rip), %eax |
ret |
|
.section .text.bar,"ax",@progbits |
.type bar, @function |
bar: |
.global bar |
ret |
|
.section .text.ifunc,"ax",@progbits |
.type ifunc, @gnu_indirect_function |
ifunc: |
ret |
|
.section .data.foo,"aw",@progbits |
xxx: |
.quad ifunc |
/ld-ifunc/ifunc.exp
0,0 → 1,354
# Expect script for linker support of IFUNC symbols and relocations. |
# |
# Copyright 2009, 2010 Free Software Foundation, Inc. |
# Contributed by Red Hat. |
# |
# This file is part of the GNU Binutils. |
# |
# This program is free software; you can redistribute it and/or modify |
# it under the terms of the GNU General Public License as published by |
# the Free Software Foundation; either version 3 of the License, or |
# (at your option) any later version. |
# |
# This program is distributed in the hope that it will be useful, |
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
# GNU General Public License for more details. |
# |
# You should have received a copy of the GNU General Public License |
# along with this program; if not, write to the Free Software |
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
# MA 02110-1301, USA. |
# |
# Written by Nick Clifton <nickc@redhat.com> |
|
|
# IFUNC support has only been implemented for the ix86, x86_64, powerpc, |
# and sparc so far. |
if {!(([istarget "i?86-*-*"] |
|| [istarget "x86_64-*-*"] |
|| [istarget "powerpc*-*-*"] |
|| [istarget "sparc*-*-*"]) |
&& ([istarget "*-*-elf*"] |
|| (([istarget "*-*-linux*"] |
|| [istarget "*-*-gnu*"]) |
&& ![istarget "*-*-*aout*"] |
&& ![istarget "*-*-*oldld*"]))) } { |
verbose "IFUNC tests not run - target does not support IFUNC" |
return |
} |
|
# We need a native system. FIXME: Strictly speaking this |
# is not true, we just need to know how to create a fully |
# linked executable, including the C and Z libraries, using |
# the linker that is under test. |
if ![isnative] { |
verbose "IFUNC tests not run - not a native toolchain" |
return |
} |
|
# We need a working compiler. (Strictly speaking this is |
# not true, we could use target specific assembler files). |
if { [which $CC] == 0 } { |
verbose "IFUNC tests not run - no compiler available" |
return |
} |
|
# A procedure to check the OS/ABI field in the ELF header of a binary file. |
proc check_osabi { binary_file expected_osabi } { |
global READELF |
global READELFFLAGS |
|
catch "exec $READELF $READELFFLAGS --file-header $binary_file > readelf.out" got |
|
if ![string match "" $got] then { |
verbose "proc check_osabi: Readelf produced unexpected out processing $binary_file: $got" |
return 0 |
} |
|
if { ![regexp "\n\[ \]*OS/ABI:\[ \]*(.+)\n\[ \]*ABI" \ |
[file_contents readelf.out] nil osabi] } { |
verbose "proc check_osabi: Readelf failed to extract an ELF header from $binary_file" |
return 0 |
} |
|
if { $osabi == $expected_osabi } { |
return 1 |
} |
|
verbose "Expected OSABI: $expected_osabi, Obtained osabi: $osabi" |
|
return 0 |
} |
|
# A procedure to confirm that a file contains the IFUNC symbol. |
# Returns -1 upon error, 0 if the symbol was not found and 1 if it was found. |
proc contains_ifunc_symbol { binary_file } { |
global READELF |
global READELFFLAGS |
|
catch "exec $READELF $READELFFLAGS --symbols $binary_file > readelf.out" got |
|
if ![string match "" $got] then { |
verbose "proc contains_ifunc_symbol: Readelf produced unexpected out processing $binary_file: $got" |
return -1 |
} |
|
# Look for a line like this: |
# 58: 0000000000400600 30 IFUNC GLOBAL DEFAULT 12 library_func2 |
|
if { ![regexp ".*\[ \]*IFUNC\[ \]+GLOBAL\[ \]+DEFAULT\[ \]+\[UND0-9\]+\[ \]+library_func2\n" [file_contents readelf.out]] } { |
return 0 |
} |
|
return 1 |
} |
|
# A procedure to confirm that a file contains the R_*_IRELATIVE |
# relocation. |
# Returns -1 upon error, 0 if the relocation was not found and 1 if |
# it was found. |
proc contains_irelative_reloc { binary_file } { |
global READELF |
global READELFFLAGS |
|
catch "exec $READELF $READELFFLAGS --relocs --wide $binary_file > readelf.out" got |
|
if ![string match "" $got] then { |
verbose "proc contains_irelative_reloc: Readelf produced unexpected out processing $binary_file: $got" |
return -1 |
} |
|
# Look for a line like this: |
# 0000000000600ab0 0000000000000025 R_X86_64_IRELATIVE 000000000040061c |
# 080496f4 0000002a R_386_IRELATIVE |
|
|
if { ![regexp "\[0-9a-f\]+\[ \]+\[0-9a-f\]+\[ \]+R_\[_0-9A-Z\]+_IREL(|ATIVE)\[ \]*\[0-9a-f\]*\n" [file_contents readelf.out]] } { |
return 0 |
} |
|
return 1 |
} |
|
# A procedure to confirm that a file contains a relocation that references an IFUNC symbol. |
# Returns -1 upon error, 0 if the reloc was not found and 1 if it was found. |
proc contains_ifunc_reloc { binary_file } { |
global READELF |
global READELFFLAGS |
|
catch "exec $READELF $READELFFLAGS --relocs $binary_file > readelf.out" got |
|
if ![string match "" $got] then { |
verbose "proc contains_ifunc_reloc: Readelf produced unexpected out processing $binary_file: $got" |
return -1 |
} |
|
if [string match "" [file_contents readelf.out]] then { |
verbose "No relocs found in $binary_file" |
return 0 |
} |
|
if { ![regexp "\\(\\)" [file_contents readelf.out]] } { |
return 0 |
} |
|
return 1 |
} |
|
set fails 0 |
|
# Create the object files, libraries and executables. |
if ![ld_compile "$CC -c -fPIC" "$srcdir/$subdir/prog.c" "tmpdir/shared_prog.o"] { |
fail "Could not create a PIC object file" |
set fails [expr $fails + 1] |
} |
if ![ld_compile "$CC -c" "$srcdir/$subdir/prog.c" "tmpdir/static_prog.o"] { |
fail "Could not create a non-PIC object file" |
set fails [expr $fails + 1] |
} |
if ![ld_compile "$CC -c -fPIC -DWITH_IFUNC" "$srcdir/$subdir/lib.c" "tmpdir/shared_ifunc.o"] { |
fail "Could not create a PIC object file containing an IFUNC symbol" |
set fails [expr $fails + 1] |
} |
if ![ld_compile "$CC -c -DWITH_IFUNC" "$srcdir/$subdir/lib.c" "tmpdir/static_ifunc.o"] { |
fail "Could not create a non-PIC object file containing an IFUNC symbol" |
set fails [expr $fails + 1] |
} |
if ![ld_compile "$CC -c -DWITHOUT_IFUNC" "$srcdir/$subdir/lib.c" "tmpdir/static_noifunc.o"] { |
fail "Could not create an ordinary non-PIC object file" |
set fails [expr $fails + 1] |
} |
if ![ld_assemble $as "$srcdir/ld-elf/empty.s" "tmpdir/empty.o"] { |
fail "Could not create an empty object file" |
set fails [expr $fails + 1] |
} |
if ![ld_compile "$CC -c" "$srcdir/$subdir/test-1.c" "tmpdir/test-1.o"] { |
fail "Could not create test-1.o" |
set fails [expr $fails + 1] |
} |
if ![ld_compile "$CC -fPIC -c" "$srcdir/$subdir/test-2.c" "tmpdir/test-2.o"] { |
fail "Could not create test-2.o" |
set fails [expr $fails + 1] |
} |
|
if { $fails != 0 } { |
return |
} |
|
if ![ld_simple_link $ld "tmpdir/libshared_ifunc.so" "-shared tmpdir/shared_ifunc.o"] { |
fail "Could not create a shared library containing an IFUNC symbol" |
set fails [expr $fails + 1] |
} |
if ![ar_simple_create $ar "" "tmpdir/libifunc.a" "tmpdir/static_ifunc.o"] { |
fail "Could not create a static library containing an IFUNC symbol" |
set fails [expr $fails + 1] |
} |
|
if { $fails != 0 } { |
return |
} |
|
if ![default_ld_link $ld "tmpdir/dynamic_prog" "-Ltmpdir tmpdir/shared_prog.o -Bdynamic -lshared_ifunc -rpath ./tmpdir"] { |
fail "Could not link a dynamic executable" |
set fails [expr $fails + 1] |
} |
if ![default_ld_link $ld "tmpdir/local_prog" "-Ltmpdir tmpdir/static_prog.o -lifunc"] { |
fail "Could not link a dynamic executable using local ifunc" |
set fails [expr $fails + 1] |
} |
if ![default_ld_link $ld "tmpdir/static_prog" "-static -Ltmpdir tmpdir/static_prog.o -lifunc"] { |
fail "Could not link a static executable" |
set fails [expr $fails + 1] |
} |
if ![ld_simple_link $ld "tmpdir/static_nonifunc_prog" "-static tmpdir/empty.o"] { |
fail "Could not link a non-ifunc using static executable" |
set fails [expr $fails + 1] |
} |
if ![default_ld_link $ld "tmpdir/test-1" "tmpdir/test-1.o tmpdir/libshared_ifunc.so"] { |
fail "Could not link test-1" |
set fails [expr $fails + 1] |
} |
if ![ld_simple_link $ld "tmpdir/libtest-2.so" "-shared tmpdir/test-2.o"] { |
fail "Could not link libtest-2.so" |
set fails [expr $fails + 1] |
} |
|
if { $fails == 0 } { |
pass "Building ifunc binaries" |
set fails 0 |
} else { |
return |
} |
|
# Check the executables and shared libraries |
# |
# The linked ifunc using executables and the shared library containing |
# ifunc should have an OSABI field of LINUX. The linked non-ifunc using |
# executable should have an OSABI field of NONE (aka System V). |
|
if {! [check_osabi tmpdir/libshared_ifunc.so {UNIX - Linux}]} { |
fail "Shared libraries containing ifunc does not have an OS/ABI field of LINUX" |
set fails [expr $fails + 1] |
} |
if {! [check_osabi tmpdir/local_prog {UNIX - Linux}]} { |
fail "Local ifunc-using executable does not have an OS/ABI field of LINUX" |
set fails [expr $fails + 1] |
} |
if {! [check_osabi tmpdir/static_prog {UNIX - Linux}]} { |
fail "Static ifunc-using executable does not have an OS/ABI field of LINUX" |
set fails [expr $fails + 1] |
} |
if {! [check_osabi tmpdir/dynamic_prog {UNIX - System V}]} { |
fail "Dynamic ifunc-using executable does not have an OS/ABI field of System V" |
set fails [expr $fails + 1] |
} |
if {! [check_osabi tmpdir/static_nonifunc_prog {UNIX - System V}]} { |
fail "Static non-ifunc-using executable does not have an OS/ABI field of System V" |
set fails [expr $fails + 1] |
} |
|
# The linked ifunc using executables and the shared library containing |
# ifunc should contain an IFUNC symbol. The non-ifunc using executable |
# should not. |
|
if {[contains_ifunc_symbol tmpdir/libshared_ifunc.so] != 1} { |
fail "Shared libraries containing ifunc does not contain an IFUNC symbol" |
set fails [expr $fails + 1] |
} |
if {[contains_ifunc_symbol tmpdir/local_prog] != 1} { |
fail "Local ifunc-using executable does not contain an IFUNC symbol" |
set fails [expr $fails + 1] |
} |
if {[contains_ifunc_symbol tmpdir/static_prog] != 1} { |
fail "Static ifunc-using executable does not contain an IFUNC symbol" |
set fails [expr $fails + 1] |
} |
if {[contains_ifunc_symbol tmpdir/dynamic_prog] != 0} { |
fail "Dynamic ifunc-using executable contains an IFUNC symbol" |
set fails [expr $fails + 1] |
} |
if {[contains_ifunc_symbol tmpdir/static_nonifunc_prog] != 0} { |
fail "Static non-ifunc-using executable contains an IFUNC symbol" |
set fails [expr $fails + 1] |
} |
if {[contains_ifunc_symbol tmpdir/test-1] != 0} { |
fail "test-1 contains IFUNC symbols" |
set fails [expr $fails + 1] |
} |
if {[contains_ifunc_symbol tmpdir/libtest-2.so] != 0} { |
fail "libtest-2.so contains IFUNC symbols" |
set fails [expr $fails + 1] |
} |
|
# The linked ifunc using executables and shared libraries should contain |
# a dynamic reloc referencing the IFUNC symbol. (Even the static |
# executable which should have a dynamic section created for it). The |
# non-ifunc using executable should not. |
|
if {[contains_irelative_reloc tmpdir/libshared_ifunc.so] != 1} { |
fail "ifunc-using shared library does not contain R_*_IRELATIVE relocation" |
set fails [expr $fails + 1] |
} |
if {[contains_irelative_reloc tmpdir/local_prog] != 1} { |
fail "Local ifunc-using executable does not contain R_*_IRELATIVE relocation" |
set fails [expr $fails + 1] |
} |
if {[contains_irelative_reloc tmpdir/static_prog] != 1} { |
fail "Static ifunc-using executable does not contain R_*_IRELATIVE relocation" |
set fails [expr $fails + 1] |
} |
if {[contains_ifunc_reloc tmpdir/dynamic_prog] != 0} { |
fail "Dynamic ifunc-using executable contains a reloc against an IFUNC symbol" |
set fails [expr $fails + 1] |
} |
if {[contains_ifunc_reloc tmpdir/static_nonifunc_prog] == 1} { |
fail "Static non-ifunc-using executable contains a reloc against an IFUNC symbol!" |
set fails [expr $fails + 1] |
} |
|
if { $fails == 0 } { |
pass "Checking ifunc binaries" |
} |
|
# Clean up, unless we are being verbose, in which case we leave the files available. |
if { $verbose < 1 } { |
remote_file host delete "tmpdir/shared_prog.o" |
remote_file host delete "tmpdir/static_prog.o" |
remote_file host delete "tmpdir/shared_ifunc.o" |
remote_file host delete "tmpdir/static_ifunc.o" |
remote_file host delete "tmpdir/static_noifunc.o" |
remote_file host delete "tmpdir/libshared_ifunc.so" |
remote_file host delete "tmpdir/libifunc.a" |
remote_file host delete "tmpdir/dynamic_prog" |
remote_file host delete "tmpdir/local_prog" |
remote_file host delete "tmpdir/static_prog" |
remote_file host delete "tmpdir/static_nonifunc_prog" |
} |
|
set test_list [lsort [glob -nocomplain $srcdir/$subdir/*.d]] |
foreach t $test_list { |
# We need to strip the ".d", but can leave the dirname. |
verbose [file rootname $t] |
run_dump_test [file rootname $t] |
} |
/ld-ifunc/ifunc-13b-x86-64.s
0,0 → 1,5
.text |
.type ifunc, @gnu_indirect_function |
.globl ifunc |
ifunc: |
ret |
/ld-ifunc/ifunc-8a-i386.s
0,0 → 1,16
.text |
.type start,"function" |
.global start |
start: |
.type _start,"function" |
.global _start |
_start: |
.type __start,"function" |
.global __start |
__start: |
.type __start,"function" |
call .L6 |
.L6: |
popl %ebx |
addl $_GLOBAL_OFFSET_TABLE_+[.-.L6], %ebx |
mov foo@GOT(%ebx), %eax |
/ld-ifunc/ifunc-5a-x86-64.d
0,0 → 1,9
#source: ifunc-5-x86-64.s |
#as: --64 |
#ld: -melf_x86_64 |
#readelf: -r --wide |
#target: x86_64-*-* |
|
Relocation section '.rela.plt' at .* |
[ ]+Offset[ ]+Info[ ]+Type[ ]+.* |
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_IRELATIVE[ ]+[0-9a-f]* |
/ld-ifunc/ifunc-2-local-i386.d
0,0 → 1,8
#ld: -m elf_i386 -shared |
#as: --32 |
#objdump: -dw |
#target: x86_64-*-* i?86-*-* |
|
#... |
[ \t0-9a-f]+:[ \t0-9a-f]+call[ \t0-9a-f]+<\*ABS\*@plt> |
#pass |
/ld-ifunc/ifunc-7a-x86-64.d
0,0 → 1,9
#source: ifunc-7-x86-64.s |
#as: --64 |
#ld: -melf_x86_64 |
#readelf: -r --wide |
#target: x86_64-*-* |
|
Relocation section '.rela.plt' at .* |
[ ]+Offset[ ]+Info[ ]+Type[ ]+.* |
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_IRELATIVE[ ]+[0-9a-f]* |
/ld-ifunc/ifunc-8-x86-64.d
0,0 → 1,10
#source: ifunc-8a-x86-64.s |
#source: ifunc-8b-x86-64.s |
#as: --64 |
#ld: -melf_x86_64 |
#readelf: -r --wide |
#target: x86_64-*-* |
|
Relocation section '.rela.plt' at .* |
[ ]+Offset[ ]+Info[ ]+Type[ ]+.* |
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_IRELATIVE[ ]+[0-9a-f]* |
/ld-ifunc/ifunc-1-x86.d
0,0 → 1,7
#ld: -shared |
#objdump: -dw |
#target: x86_64-*-* i?86-*-* |
|
#... |
[ \t0-9a-f]+:[ \t0-9a-f]+call[ \t0-9a-fq]+<\*ABS\*(\+0x220|)@plt> |
#pass |
/ld-ifunc/ifunc-3b-x86.d
0,0 → 1,8
#source: ifunc-3-x86.s |
#ld: -shared |
#readelf: -r --wide |
#target: x86_64-*-* i?86-*-* |
|
#... |
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_[_0-9A-Z]+_IRELATIVE[ ]*[0-9a-f]* |
#pass |
/ld-ifunc/ifunc-13a-i386.s
0,0 → 1,10
.text |
.type foo, @function |
.global |
foo: |
movl xxx@GOT(%ebx), %eax |
ret |
|
.data |
xxx: |
.long ifunc |
/ld-ifunc/ifunc-9-x86.d
0,0 → 1,3
#ld: --export-dynamic |
#error: .*dynamic STT_GNU_IFUNC symbol `foo' with pointer equality in `.*.o' can not be used when making an executable; recompile with -fPIE and relink with -pie |
#target: x86_64-*-* i?86-*-* |
/ld-ifunc/ifunc-13-x86-64.d
0,0 → 1,18
#source: ifunc-13a-x86-64.s |
#source: ifunc-13b-x86-64.s |
#ld: -shared -m elf_x86_64 -z nocombreloc |
#as: --64 |
#readelf: -r --wide |
#target: x86_64-*-* |
|
Relocation section '.rela.got' at .* |
[ ]+Offset[ ]+Info[ ]+Type[ ]+.* |
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_GLOB_DAT[ ]+ifunc\(\)[ ]+ifunc \+ 0 |
#... |
Relocation section '.rela.ifunc' at .* |
[ ]+Offset[ ]+Info[ ]+Type[ ]+.* |
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_64[ ]+ifunc\(\)[ ]+ifunc \+ 0 |
#... |
Relocation section '.rela.plt' at .* |
[ ]+Offset[ ]+Info[ ]+Type[ ]+.* |
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_JUMP_SLOT[ ]+ifunc\(\)[ ]+ifunc \+ 0 |
/ld-ifunc/ifunc-2-local-i386.s
0,0 → 1,18
.type foo, %gnu_indirect_function |
.set __GI_foo, foo |
.text |
.type foo, @function |
foo: |
ret |
.size foo, .-foo |
.globl bar |
.type bar, @function |
bar: |
call .L6 |
.L6: |
popl %ebx |
addl $_GLOBAL_OFFSET_TABLE_+[.-.L6], %ebx |
call __GI_foo |
leal __GI_foo@GOTOFF(%ebx), %eax |
ret |
.size bar, .-bar |
/ld-ifunc/binutils.exp
0,0 → 1,101
# Expect script for binutils tests |
# Copyright 2009, 2010 Free Software Foundation, Inc. |
# |
# This file is part of the GNU Binutils. |
# |
# This program is free software; you can redistribute it and/or modify |
# it under the terms of the GNU General Public License as published by |
# the Free Software Foundation; either version 3 of the License, or |
# (at your option) any later version. |
# |
# This program is distributed in the hope that it will be useful, |
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
# GNU General Public License for more details. |
# |
# You should have received a copy of the GNU General Public License |
# along with this program; if not, write to the Free Software |
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
# MA 02110-1301, USA. |
# |
# Written by H.J. Lu (hongjiu.lu@intel.com) |
# |
|
# Make sure that binutils can correctly handle ld output in ELF with |
# STT_GNU_IFUNC symbols. |
|
if { !([istarget "i?86-*-elf*"] |
|| (([istarget "i?86-*-linux*"] |
|| [istarget "i?86-*-gnu*"]) |
&& ![istarget "*-*-*aout*"] |
&& ![istarget "*-*-*oldld*"]) |
|| [istarget "x86_64-*-linux*"] |
|| [istarget "amd64-*-linux*"]) } { |
return |
} |
|
proc binutils_test { prog_name ld_options test } { |
global as |
global ld |
global READELF |
global objcopy |
global strip |
global srcdir |
global subdir |
global link_output |
|
eval set prog \$$prog_name |
set test_name "$prog_name $ld_options ($test)" |
|
if { ![ld_assemble $as $srcdir/$subdir/$test.s tmpdir/$test.o ] } { |
unresolved "$test_name" |
return |
} |
|
if { ![ld_simple_link $ld tmpdir/$test "$ld_options tmpdir/$test.o"] } { |
if { [string match "*not supported*" $link_output] |
|| [string match "*unrecognized option*" $link_output] } { |
unsupported "$ld_options is not supported by this target" |
} else { |
unresolved "$test_name" |
} |
return |
} |
|
send_log "$READELF -l --wide tmpdir/$test > tmpdir/$test.exp\n" |
set got [remote_exec host "$READELF -l --wide tmpdir/$test" "" "/dev/null" "tmpdir/$test.exp"] |
if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then { |
send_log "$got\n" |
unresolved "$test_name" |
return |
} |
|
send_log "$prog tmpdir/$test\n" |
set got [remote_exec host "$prog tmpdir/$test"] |
if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then { |
send_log "$got\n" |
fail "$test_name" |
return |
} |
|
send_log "$READELF -l --wide tmpdir/$test > tmpdir/$test.out\n" |
set got [remote_exec host "$READELF -l --wide tmpdir/$test" "" "/dev/null" "tmpdir/$test.out"] |
if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then { |
send_log "$got\n" |
unresolved "$test_name" |
return |
} |
|
if { [catch {exec cmp tmpdir/$test.exp tmpdir/$test.out}] } then { |
send_log "tmpdir/$test.exp tmpdir/$test.out differ.\n" |
fail "$test_name" |
return |
} |
|
pass "$test_name" |
} |
|
binutils_test strip "" ifunc-4-x86 |
binutils_test objcopy "" ifunc-4-x86 |
binutils_test strip "" ifunc-4-local-x86 |
binutils_test objcopy "" ifunc-4-local-x86 |
/ld-ifunc/ifunc-1-x86.s
0,0 → 1,16
.type foo, %gnu_indirect_function |
.global __GI_foo |
.hidden __GI_foo |
.set __GI_foo, foo |
.text |
.globl foo |
.type foo, @function |
foo: |
ret |
.size foo, .-foo |
.globl bar |
.type bar, @function |
bar: |
call __GI_foo@PLT |
ret |
.size bar, .-bar |
/ld-ifunc/ifunc-2-local-x86-64.d
0,0 → 1,9
#as: --64 |
#ld: -shared -melf_x86_64 |
#objdump: -dw |
#target: x86_64-*-* |
|
#... |
[ \t0-9a-f]+:[ \t0-9a-f]+call[ \t0-9a-fq]+<\*ABS\*\+0x220@plt> |
[ \t0-9a-f]+:[ \t0-9a-f]+lea[ \t]+.*\(%rip\),%rax.*[ \t0-9a-fq]+<\*ABS\*\+0x220@plt> |
#pass |
/ld-ifunc/lib.c
0,0 → 1,39
int |
library_func1 (void) |
{ |
return 2; |
} |
|
int global = 1; |
|
#ifdef WITH_IFUNC |
|
static int minus_one (void) { return -1; } |
static int zero (void) { return 0; } |
|
void * library_func2_ifunc (void) __asm__ ("library_func2"); |
void * library_func2_ifunc (void) { return global ? minus_one : zero ; } |
__asm__(".type library_func2, %gnu_indirect_function"); |
|
extern int library_func2 (int); |
extern __typeof (library_func2) library_func2 __asm__ ("__GI_library_func2"); |
|
__asm__(".global __GI_library_func2"); |
__asm__(".hidden __GI_library_func2"); |
__asm__(".set __GI_library_func2, library_func2"); |
|
int |
library_func (int x) |
{ |
return library_func2 (x); |
} |
|
#else /* WITHOUT_IFUNC */ |
|
int |
library_func2 (void) |
{ |
return 3; |
} |
|
#endif |
/ld-ifunc/ifunc-3-x86.s
0,0 → 1,16
.type foo, %gnu_indirect_function |
.global __GI_foo |
.protected __GI_foo |
.set __GI_foo, foo |
.text |
.globl foo |
.type foo, @function |
foo: |
ret |
.size foo, .-foo |
.globl bar |
.type bar, @function |
bar: |
call __GI_foo@PLT |
ret |
.size bar, .-bar |
/ld-ifunc/prog.c
0,0 → 1,46
extern int printf (const char *, ...); |
|
extern int library_func1 (void); |
extern int library_func2 (void); |
extern int global; |
|
int |
main (void) |
{ |
int res = -1; |
|
res += library_func1 (); |
res += library_func2 (); |
|
switch (res) |
{ |
case 0: |
if (global) |
printf ("ifunc working correctly\n"); |
else |
{ |
printf ("wrong value returned by library_func2\n"); |
res = -1; |
} |
break; |
|
case 1: |
if (global) |
printf ("wrong value returned by library_func2\n"); |
else |
{ |
printf ("ifunc working correctly\n"); |
res = 0; |
} |
break; |
|
case 4: |
printf ("non-ifunc testcase\n"); |
break; |
|
default: |
printf ("ifunc function not evaluated at run-time, res = %x\n", res); |
break; |
} |
return res; |
} |
/ld-ifunc/ifunc-12-i386.d
0,0 → 1,6
#ld: -shared -m elf_i386 -e bar --gc-sections |
#as: --32 |
#readelf: -r --wide |
#target: x86_64-*-* i?86-*-* |
|
There are no relocations in this file. |
/ld-ifunc/ifunc-9-x86.s
0,0 → 1,18
.text |
.type foo, %gnu_indirect_function |
.globl foo |
.type foo, @function |
foo: |
ret |
.size foo, .-foo |
.type start,"function" |
.global start |
start: |
.type _start,"function" |
.global _start |
_start: |
.type __start,"function" |
.global __start |
__start: |
.type __start,"function" |
movl foo, %eax |
/ld-ifunc/ifunc-1-local-x86.d
0,0 → 1,7
#ld: -shared |
#objdump: -dw |
#target: x86_64-*-* i?86-*-* |
|
#... |
[ \t0-9a-f]+:[ \t0-9a-f]+call[ \t0-9a-fq]+<\*ABS\*(\+0x200|)@plt> |
#pass |
/ld-ifunc/test-2.c
0,0 → 1,3
extern int library_func2 (void); |
int foo (void) { library_func2 (); return 0; } |
__asm__(".type library_func2, %gnu_indirect_function"); |
/ld-ifunc/ifunc-7-i386.s
0,0 → 1,24
.text |
.type foo, %gnu_indirect_function |
.globl foo |
.type foo, @function |
foo: |
ret |
.size foo, .-foo |
.hidden foo |
.type start,"function" |
.global start |
start: |
.type _start,"function" |
.global _start |
_start: |
.type __start,"function" |
.global __start |
__start: |
.type __start,"function" |
call .L6 |
.L6: |
popl %ebx |
addl $_GLOBAL_OFFSET_TABLE_+[.-.L6], %ebx |
call foo@PLT |
leal foo@GOT(%ebx), %eax |
/ld-ifunc/ifunc-4-local-x86.d
0,0 → 1,7
#ld: |
#readelf: -r --wide |
#target: x86_64-*-* i?86-*-* |
|
#... |
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_[_0-9A-Z]+_IRELATIVE[ ]*[0-9a-f]* |
#pass |
/ld-ifunc/ifunc-5b-x86-64.d
0,0 → 1,13
#source: ifunc-5-x86-64.s |
#as: --64 |
#ld: -melf_x86_64 -shared -z nocombreloc |
#readelf: -r --wide |
#target: x86_64-*-* |
|
Relocation section '.rela.got' at .* |
[ ]+Offset[ ]+Info[ ]+Type[ ]+.* |
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_GLOB_DAT[ ]+foo\(\)[ ]+foo \+ 0 |
#... |
Relocation section '.rela.plt' at .* |
[ ]+Offset[ ]+Info[ ]+Type[ ]+.* |
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_JUMP_SLOT[ ]+foo\(\)[ ]+foo \+ 0 |
/ld-ifunc/ifunc-2-local-x86-64.s
0,0 → 1,17
.type foo, %gnu_indirect_function |
.global __GI_foo |
.hidden __GI_foo |
.set __GI_foo, foo |
.text |
.globl foo |
.type foo, @function |
foo: |
ret |
.size foo, .-foo |
.globl bar |
.type bar, @function |
bar: |
call __GI_foo |
leaq __GI_foo(%rip), %rax |
ret |
.size bar, .-bar |
/ld-ifunc/ifunc-7b-x86-64.d
0,0 → 1,9
#source: ifunc-7-x86-64.s |
#as: --64 |
#ld: -melf_x86_64 -shared |
#readelf: -r --wide |
#target: x86_64-*-* |
|
Relocation section '.rela.plt' at .* |
[ ]+Offset[ ]+Info[ ]+Type[ ]+.* |
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_X86_64_IRELATIVE[ ]+[0-9a-f]* |
/ld-ifunc/ifunc-4a-x86.d
0,0 → 1,8
#ld: -s |
#readelf: -r --wide |
#target: x86_64-*-* i?86-*-* |
#source: ifunc-4-x86.s |
|
#... |
[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_[_0-9A-Z]+_IRELATIVE[ ]*[0-9a-f]* |
#pass |
/ld-ifunc/ifunc-12-i386.s
0,0 → 1,25
.section .text.foo,"ax",@progbits |
.type foo, @function |
foo: |
movl ifunc@GOT(%ecx), %eax |
movl ifunc@GOTOFF(%ecx), %eax |
call ifunc@PLT |
call ifunc |
movl xxx@GOT(%ecx), %eax |
movl xxx, %eax |
ret |
|
.section .text.bar,"ax",@progbits |
.type bar, @function |
bar: |
.global bar |
ret |
|
.section .text.ifunc,"ax",@progbits |
.type ifunc, @gnu_indirect_function |
ifunc: |
ret |
|
.section .data.foo,"aw",@progbits |
xxx: |
.long ifunc |
/ld-ifunc/ifunc-2-i386.d
0,0 → 1,8
#ld: -m elf_i386 -shared |
#as: --32 |
#objdump: -dw |
#target: x86_64-*-* i?86-*-* |
|
#... |
[ \t0-9a-f]+:[ \t0-9a-f]+call[ \t0-9a-f]+<\*ABS\*@plt> |
#pass |
/ld-ifunc/ifunc-10-x86-64.d
0,0 → 1,6
#ld: -m elf_x86_64 -e bar --gc-sections |
#as: --64 |
#readelf: -r --wide |
#target: x86_64-*-* |
|
There are no relocations in this file. |
/ld-ifunc/ifunc-1-local-x86.s
0,0 → 1,13
.type foo, %gnu_indirect_function |
.set __GI_foo, foo |
.text |
.type foo, @function |
foo: |
ret |
.size foo, .-foo |
.globl bar |
.type bar, @function |
bar: |
call __GI_foo@PLT |
ret |
.size bar, .-bar |