diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2015-08-11 12:58:52 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2015-08-11 12:59:11 -0700 |
commit | 97dc35c88dd470465a99edeb0b491012a368f2bf (patch) | |
tree | dbbd0ec476974879e80a24140beed3c941f315a8 /ld/testsuite/lib | |
parent | 922c5db5e733526f12e2fbfeb72c7f1f90089d53 (diff) | |
download | fsf-binutils-gdb-97dc35c88dd470465a99edeb0b491012a368f2bf.zip fsf-binutils-gdb-97dc35c88dd470465a99edeb0b491012a368f2bf.tar.gz fsf-binutils-gdb-97dc35c88dd470465a99edeb0b491012a368f2bf.tar.bz2 |
Skip IFUNC relocations in debug sections
Skip IFUNC relocations in debug sections ignored by ld.so.
bfd/
PR ld/18808
* elf32-i386.c (elf_i386_relocate_section): Skip IFUNC
relocations in debug sections.
* elf64-x86-64.c (elf_x86_64_relocate_section): Likewise.
ld/testsuite/
PR ld/18808
* ld-ifunc/ifunc.exp: Add a test for PR ld/18808.
* ld-ifunc/pr18808.out: New file.
* ld-ifunc/pr18808a.c: Likewise.
* ld-ifunc/pr18808b.c: Likewise.
Diffstat (limited to 'ld/testsuite/lib')
-rw-r--r-- | ld/testsuite/lib/ld-lib.exp | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/ld/testsuite/lib/ld-lib.exp b/ld/testsuite/lib/ld-lib.exp index 6904499..364c6fa 100644 --- a/ld/testsuite/lib/ld-lib.exp +++ b/ld/testsuite/lib/ld-lib.exp @@ -1960,6 +1960,51 @@ proc check_ifunc_available { } { return $ifunc_available_saved } +# Returns true if ifunc attribute works. + +proc check_ifunc_attribute_available { } { + global ifunc_attribute_available_saved + global CC + + if {![info exists ifunc_attribute_available_saved]} { + if { [which $CC] == 0 } { + set ifunc_attribute_available_saved 0 + return 0 + } + # Check if gcc supports -flto -fuse-linker-plugin + set flags "" + if [board_info [target_info name] exists cflags] { + append flags " [board_info [target_info name] cflags]" + } + if [board_info [target_info name] exists ldflags] { + append flags " [board_info [target_info name] ldflags]" + } + + set basename "tmpdir/ifunc[pid]" + set src ${basename}.c + set output ${basename}.out + set f [open $src "w"] + puts $f "extern int library_func2 (void) __attribute__ ((ifunc (\"foo\")));" + puts $f "int main (void)" + puts $f "{" + puts $f " if (library_func2 () != 2) __builtin_abort ();" + puts $f " return 0; " + puts $f "}" + puts $f "static int library_func1 (void) {return 2; }" + puts $f "void *foo (void) { return library_func1; }" + close $f + remote_download host $src + set ifunc_attribute_available_saved [run_host_cmd_yesno "$CC" "$flags $src -o $output"] + if { $ifunc_attribute_available_saved == 1 } { + set ifunc_attribute_available_saved [run_host_cmd_yesno "$output" ""] + } + remote_file host delete $src + remote_file host delete $output + file delete $src + } + return $ifunc_attribute_available_saved +} + # Provide virtual target "cfi" for targets supporting CFI. rename "istarget" "istarget_ld" |