OpenCores
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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.