dd7e64d45b
When there are both PLT and GOT references to the same function symbol, linker will create a GOTPLT slot for PLT entry and a GOT slot for GOT reference. A run-time JUMP_SLOT relocation is created to update the GOTPLT slot and a run-time GLOB_DAT relocation is created to update the GOT slot. Both JUMP_SLOT and GLOB_DAT relocations will apply the same symbol value to GOTPLT and GOT slots, respectively, at run-time. This optimization combines GOTPLT and GOT slots into a single GOT slot and removes the run-time JUMP_SLOT relocation. It replaces the regular PLT entry: indirect jump [GOTPLT slot] push relocation index jump PLT0 with an GOT PLT entry with an indirect jump via the GOT slot: indirect jump [GOT slot] nop and resolves PLT reference to the GOT PLT entry. We must avoid this optimization if pointer equality is needed since we don't clear symbol value in this case and the dynamic linker won't update the GOT slot. Otherwise, the resulting binary will get into an infinite loop at run-time. bfd/ * elf32-i386.c (elf_i386_got_plt_entry): New. (elf_i386_pic_got_plt_entry): Likewise. (elf_i386_link_hash_entry): Add plt_got. (elf_i386_link_hash_table): Likewise. (elf_i386_link_hash_newfunc): Initialize plt_got.offset to -1. (elf_i386_get_local_sym_hash): Likewise. (elf_i386_check_relocs): Create the GOT PLT if there are both PLT and GOT references when the regular PLT is used. (elf_i386_allocate_dynrelocs): Use the GOT PLT if there are both PLT and GOT references unless pointer equality is needed. (elf_i386_relocate_section): Also check the GOT PLT when resolving R_386_PLT32. (elf_i386_finish_dynamic_symbol): Use the GOT PLT if it is available. * elf64-x86-64.c (elf_x86_64_link_hash_entry): Add plt_got. (elf_x86_64_link_hash_table): Likewise. (elf_x86_64_link_hash_newfunc): Initialize plt_got.offset to -1. (elf_x86_64_get_local_sym_hash): Likewise. (elf_x86_64_check_relocs): Create the GOT PLT if there are both PLT and GOT references when the regular PLT is used. (elf_x86_64_allocate_dynrelocs): Use the GOT PLT if there are both PLT and GOT references unless pointer equality is needed. (elf_x86_64_relocate_section): Also check the GOT PLT when resolving R_X86_64_PLT32. (elf_x86_64_finish_dynamic_symbol): Use the GOT PLT if it is available. ld/ * emulparams/elf_i386.sh (TINY_READONLY_SECTION): New. * emulparams/elf_x86_64.sh (TINY_READONLY_SECTION): Add .plt.got. ld/testsuite/ * ld-i386/i386.exp: Add run-time relocation tests for plt-main. * ld-i386/plt-main.rd: New file. * ld-x86-64/plt-main-bnd.dd: Likewise. * ld-x86-64/plt-main.rd: Likewise. * ld-x86-64/x86-64.exp: Add run-time relocation tests for plt-main.
472 lines
14 KiB
Text
472 lines
14 KiB
Text
# Expect script for ld-x86_64 tests
|
|
# Copyright (C) 2002-2014 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.
|
|
#
|
|
|
|
# Test x86_64 linking; all types of relocs. This tests the assembler and
|
|
# tools like objdump as well as the linker.
|
|
|
|
if { !([istarget "x86_64-*-elf*"]
|
|
|| [istarget "x86_64-*-nacl*"]
|
|
|| [istarget "x86_64-*-linux*"]) } {
|
|
return
|
|
}
|
|
|
|
if [istarget "*-*-nacl*"] {
|
|
set emul "elf_x86_64_nacl"
|
|
} else {
|
|
set emul "elf_x86_64"
|
|
}
|
|
|
|
# List contains test-items with 3 items followed by 2 lists:
|
|
# 0:name 1:ld early options 2:ld late options 3:assembler options
|
|
# 4:filenames of assembler files 5: action and options. 6: name of output file
|
|
|
|
# Actions:
|
|
# objdump: Apply objdump options on result. Compare with regex (last arg).
|
|
# nm: Apply nm options on result. Compare with regex (last arg).
|
|
# readelf: Apply readelf options on result. Compare with regex (last arg).
|
|
|
|
set x86_64tests {
|
|
{"Helper shared library (basic PLT test)"
|
|
"-shared -melf_x86_64" "" "--64" {pltlib.s} {} "libpltlib.so"}
|
|
{"basic PLT generation"
|
|
"-melf_x86_64 tmpdir/libpltlib.so" "" "--64" {plt.s}
|
|
{{objdump -drj.plt plt.pd}} "plt"}
|
|
{"TLS -fpic -shared transitions"
|
|
"-shared -melf_x86_64 --no-ld-generated-unwind-info" ""
|
|
"--64" {tlspic1.s tlspic2.s}
|
|
{{readelf -WSsrl tlspic.rd} {objdump -drj.text tlspic.dd}
|
|
{objdump -sj.got tlspic.sd} {objdump -sj.tdata tlspic.td}}
|
|
"libtlspic.so"}
|
|
{"TLS descriptor -fpic -shared transitions"
|
|
"-shared -melf_x86_64 --no-ld-generated-unwind-info" ""
|
|
"--64" {tlsdesc.s tlspic2.s}
|
|
{{readelf -WSsrld tlsdesc.rd} {objdump -drj.text tlsdesc.dd}
|
|
{objdump "-s -j.got -j.got.plt" tlsdesc.sd} {objdump -sj.tdata tlsdesc.td}
|
|
{objdump -drj.plt tlsdesc.pd}} "libtlsdesc.so"}
|
|
{"Helper shared library" "-shared -melf_x86_64" ""
|
|
"--64" {tlslib.s} {} "libtlslib.so"}
|
|
{"TLS -fpic and -fno-pic exec transitions"
|
|
"-melf_x86_64 tmpdir/libtlslib.so --no-ld-generated-unwind-info" ""
|
|
"--64" {tlsbinpic.s tlsbin.s}
|
|
{{readelf -WSsrl tlsbin.rd} {objdump -drj.text tlsbin.dd}
|
|
{objdump -sj.got tlsbin.sd} {objdump -sj.tdata tlsbin.td}}
|
|
"tlsbin"}
|
|
{"TLS descriptor -fpic and -fno-pic exec transitions"
|
|
"-melf_x86_64 tmpdir/libtlslib.so --no-ld-generated-unwind-info" ""
|
|
"--64" {tlsbindesc.s tlsbin.s}
|
|
{{readelf -WSsrl tlsbindesc.rd} {objdump -drj.text tlsbindesc.dd}
|
|
{objdump -sj.got tlsbindesc.sd} {objdump -sj.tdata tlsbindesc.td}}
|
|
"tlsbindesc"}
|
|
{"TLS with global dynamic and descriptors"
|
|
"-shared -melf_x86_64 --no-ld-generated-unwind-info" ""
|
|
"--64" {tlsgdesc.s}
|
|
{{readelf -WSsrl tlsgdesc.rd} {objdump -drj.text tlsgdesc.dd}}
|
|
"libtlsgdesc.so"}
|
|
{"TLS in debug sections" "-melf_x86_64" ""
|
|
"--64" {tlsg.s}
|
|
{{objdump -sj.debug_foobar tlsg.sd}} "tlsg"}
|
|
{"TLS GD->LE transition" "-melf_x86_64" ""
|
|
"--64" {tlsgd1.s}
|
|
{{objdump -dwr tlsgd1.dd}} "tlsgd1"}
|
|
{"TLS LD->LE transition" "-melf_x86_64" ""
|
|
"--64" {tlsld1.s}
|
|
{{objdump -dwr tlsld1.dd}} "tlsld1"}
|
|
{"TLS IE->LE transition" "-melf_x86_64" ""
|
|
"--64" {tlsie1.s}
|
|
{{objdump -dwr tlsie1.dd}} "tlsie1"}
|
|
{"Helper 64bit object 1" "-r -melf_x86_64" ""
|
|
"--64" {mixed1a.s} {} "libmixe1a.o"}
|
|
{"Helper 32bit object 1" "-r -melf_i386" ""
|
|
"--32" {mixed1b.s} {} "libmixe1b.o"}
|
|
{"Helper 64bit object 2" "-r -melf_x86_64" ""
|
|
"--64" {mixed2a.s} {} "libmixe2a.o"}
|
|
{"Helper 32bit object 2" "-r -melf_i386" ""
|
|
"--32" {mixed2b.s} {} "libmixe2b.o"}
|
|
{"Split by file with 'l' flag on section."
|
|
"-split-by-file -r -melf_x86_64" ""
|
|
"--64" {split-by-file1.s split-by-file2.s}
|
|
{{readelf -SW split-by-file.rd}} "split-by-file.o"}
|
|
{"TLS X32 IE->LE transition" "-melf32_x86_64" ""
|
|
"--x32" {tlsie4.s}
|
|
{{objdump -dwr tlsie4.dd}} "tlsie4"}
|
|
{"TLS X32 GD->LE transition" "-melf32_x86_64" ""
|
|
"--x32" {tlsgd4.s}
|
|
{{objdump -dwr tlsgd4.dd}} "tlsgd4"}
|
|
{"Helper TLS GD->IE transition DSO" "-shared -melf_x86_64" ""
|
|
"--64" {tlsgd5b.s} {} "libtlsgd5.so"}
|
|
{"TLS GD->IE transition" "-melf_x86_64 tmpdir/libtlsgd5.so" ""
|
|
"--64" {tlsgd5a.s}
|
|
{{objdump -dwr tlsgd5.dd}} "tlsgd5"}
|
|
{"Helper TLS X32 GD->IE transition DSO" "-shared -melf32_x86_64" ""
|
|
"--x32" {tlsgd6b.s} {} "libtlsgd6.so"}
|
|
{"TLS X32 GD->IE transition" "-melf32_x86_64 tmpdir/libtlsgd6.so" ""
|
|
"--x32" {tlsgd6a.s}
|
|
{{objdump -dwr tlsgd6.dd}} "tlsgd6"}
|
|
{"TLS X32 LD->LE transition" "-melf32_x86_64" ""
|
|
"--x32" {tlsld2.s}
|
|
{{objdump -dwr tlsld2.dd}} "tlsld2"}
|
|
{"TLS -mcmodel=large GD->LE transition" "-melf_x86_64" ""
|
|
"--64" {tlsgd7.s}
|
|
{{objdump -dwr tlsgd7.dd}} "tlsgd7"}
|
|
{"TLS -mcmodel=large LD->LE transition" "-melf_x86_64" ""
|
|
"--64" {tlsld3.s}
|
|
{{objdump -dwr tlsld3.dd}} "tlsld3"}
|
|
{"TLS -mcmodel=large GD->IE transition" "-melf_x86_64 tmpdir/libtlsgd5.so" ""
|
|
"--64" {tlsgd8.s}
|
|
{{objdump -dwrj.text tlsgd8.dd}} "tlsgd8"}
|
|
|
|
{"build 32-bit object with 33 locals" "-melf_x86_64 -e 0" "" "--32" {32bit.s} {{ ld incompatible.l }} "dummy" }
|
|
{"build 64-bit object" "-melf_x86_64 -e 0 --defsym foo=1" "" "--64" {64bit.s} {} "dummy" }
|
|
{"link mixed objects" "-melf_x86_64 -e 0 tmpdir/32bit.o tmpdir/64bit.o" "" "" {} { { ld incompatible.l } } "mixed"}
|
|
{"PR ld/17313 (1)" "-melf_x86_64" ""
|
|
"--64" {dummy.s} {} ""}
|
|
{"PR ld/17313 (2)" "-melf_x86_64 -shared --just-symbols=tmpdir/dummy.o" ""
|
|
"--64" {lea1.s} {} "libpr17313.so"}
|
|
{"PR ld/17306 (1)" "-melf_x86_64" ""
|
|
"--64" {pr17306b.s} {} ""}
|
|
{"PR ld/17306 (2)" "-melf_x86_64 -shared -Bsymbolic --just-symbols=tmpdir/pr17306b.o" ""
|
|
"--64" {pr17306a.s} {} "libpr17306.so"}
|
|
}
|
|
|
|
# So as to avoid rewriting every last test case here in a nacl variant,
|
|
# we use black magic to massage the generic cases into nacl-variant cases.
|
|
if [istarget "*-*-nacl*"] {
|
|
set emul elf_x86_64_nacl
|
|
|
|
set lhs {elf(32)?_(i386|x86_64)[[:>:]]}
|
|
set rhs {&_nacl}
|
|
|
|
# Change all the -melf_x86_64 to -melf_x86_64_nacl so linking can succeed.
|
|
regsub -all -- $lhs $x86_64tests $rhs x86_64tests
|
|
|
|
# Same, applied to all the run_dump_test cases.
|
|
set options_regsub(ld) [list $lhs $rhs]
|
|
|
|
# The section/segment layout differs too much for the vanilla
|
|
# readelf output files to match. So massage the cases so that
|
|
# they refer to a foo-nacl.rd file instead of a foo.rd file.
|
|
regsub -all -- {([a-z0-9]+)\.rd} $x86_64tests {\1-nacl.rd} x86_64tests
|
|
|
|
# Likewise for PLTs.
|
|
regsub -all -- {([a-z0-9]+)\.pd} $x86_64tests {\1-nacl.pd} x86_64tests
|
|
} else {
|
|
set emul elf_x86_64
|
|
}
|
|
|
|
run_ld_link_tests $x86_64tests
|
|
|
|
global link_output
|
|
global ld
|
|
|
|
set test_name "Mixed x86_64 and i386 input test 1"
|
|
set test mixed1
|
|
if { ![ld_simple_link $ld tmpdir/$test "-m$emul tmpdir/${test}a.o tmpdir/${test}b.o"] } {
|
|
if [string match "*i386* architecture of input file `tmpdir/${test}b.o' is incompatible with i386:x86-64* output*" $link_output] {
|
|
pass "$test_name"
|
|
} {
|
|
fail "$test_name"
|
|
}
|
|
}
|
|
|
|
set test_name "Mixed x86_64 and i386 input test 2"
|
|
set test mixed2
|
|
if { ![ld_simple_link $ld tmpdir/$test "-m$emul tmpdir/${test}a.o tmpdir/${test}b.o"] } {
|
|
if [string match "*i386* architecture of input file `tmpdir/${test}b.o' is incompatible with i386:x86-64* output*" $link_output] {
|
|
pass "$test_name"
|
|
} {
|
|
fail "$test_name"
|
|
}
|
|
}
|
|
|
|
run_dump_test "abs"
|
|
run_dump_test "abs-l1om"
|
|
run_dump_test "pcrel8"
|
|
run_dump_test "pcrel16"
|
|
run_dump_test "tlsgd2"
|
|
run_dump_test "tlsgd3"
|
|
run_dump_test "tlsie2"
|
|
run_dump_test "tlsie3"
|
|
run_dump_test "hidden1"
|
|
run_dump_test "hidden2"
|
|
run_dump_test "hidden3"
|
|
run_dump_test "protected1"
|
|
run_dump_test "protected2"
|
|
run_dump_test "protected2-l1om"
|
|
run_dump_test "protected3"
|
|
run_dump_test "protected3-l1om"
|
|
run_dump_test "protected4"
|
|
run_dump_test "protected5"
|
|
run_dump_test "tlsle1"
|
|
run_dump_test "tlspie1"
|
|
run_dump_test "unique1"
|
|
run_dump_test "nogot1"
|
|
run_dump_test "nogot2"
|
|
run_dump_test "discarded1"
|
|
run_dump_test "pr12718"
|
|
run_dump_test "pr12921"
|
|
run_dump_test "pr13947"
|
|
run_dump_test "pr12570a"
|
|
run_dump_test "pr12570b"
|
|
run_dump_test "pr14215"
|
|
run_dump_test "pr14207"
|
|
run_dump_test "gotplt1"
|
|
|
|
if { ![istarget "x86_64-*-linux*"] && ![istarget "x86_64-*-nacl*"]} {
|
|
return
|
|
}
|
|
|
|
if ![ld_assemble $as "--x32 $srcdir/$subdir/start.s" tmpdir/startx32.o] {
|
|
unresolved "Build ILP32 start.o"
|
|
return
|
|
}
|
|
|
|
if ![ld_assemble $as "--32 $srcdir/$subdir/start.s" tmpdir/start32.o] {
|
|
unresolved "Build ia32 start.o"
|
|
return
|
|
}
|
|
|
|
if ![ld_assemble $as "--64 $srcdir/$subdir/start.s" tmpdir/start64.o] {
|
|
unresolved "Build LP64 start.o"
|
|
return
|
|
}
|
|
|
|
if ![ld_assemble $as "--x32 $srcdir/$subdir/foo.s" tmpdir/foox32.o] {
|
|
unresolved "Build ILP32 foo.o"
|
|
return
|
|
}
|
|
|
|
if ![ld_assemble $as "--32 $srcdir/$subdir/foo.s" tmpdir/foo32.o] {
|
|
unresolved "Build ia32 foo.o"
|
|
return
|
|
}
|
|
|
|
if ![ld_assemble $as "--64 $srcdir/$subdir/foo.s" tmpdir/foo64.o] {
|
|
unresolved "Build LP64 foo.o"
|
|
return
|
|
}
|
|
|
|
run_dump_test "compressed1"
|
|
run_dump_test "ilp32-1"
|
|
run_dump_test "ilp32-2"
|
|
run_dump_test "ilp32-3"
|
|
run_dump_test "ilp32-4"
|
|
run_dump_test "ilp32-4-nacl"
|
|
run_dump_test "ilp32-5"
|
|
run_dump_test "ilp32-6"
|
|
run_dump_test "ilp32-7"
|
|
run_dump_test "ilp32-8"
|
|
run_dump_test "ilp32-9"
|
|
run_dump_test "ilp32-10"
|
|
run_dump_test "ilp32-11"
|
|
run_dump_test "ia32-1"
|
|
run_dump_test "ia32-2"
|
|
run_dump_test "ia32-3"
|
|
run_dump_test "lp64-1"
|
|
run_dump_test "lp64-2"
|
|
run_dump_test "lp64-3"
|
|
run_dump_test "pr13082-1a"
|
|
run_dump_test "pr13082-1b"
|
|
run_dump_test "pr13082-2a"
|
|
run_dump_test "pr13082-2b"
|
|
run_dump_test "pr13082-3a"
|
|
run_dump_test "pr13082-3b"
|
|
run_dump_test "pr13082-4a"
|
|
run_dump_test "pr13082-4b"
|
|
run_dump_test "pr13082-5a"
|
|
run_dump_test "pr13082-5b"
|
|
run_dump_test "pr13082-6a"
|
|
run_dump_test "pr13082-6b"
|
|
run_dump_test "lea1a"
|
|
run_dump_test "lea1b"
|
|
run_dump_test "lea1c"
|
|
run_dump_test "lea1d"
|
|
run_dump_test "lea1e"
|
|
run_dump_test "lea1f"
|
|
run_dump_test "lea1g"
|
|
run_dump_test "lea1h"
|
|
run_dump_test "lea1i"
|
|
run_dump_test "lea1j"
|
|
run_dump_test "lea1k"
|
|
run_dump_test "lea1l"
|
|
run_dump_test "mov1a"
|
|
run_dump_test "mov1b"
|
|
run_dump_test "mov1c"
|
|
run_dump_test "mov1d"
|
|
|
|
# Must be native with the C compiler
|
|
if { [isnative] && [which $CC] != 0 } {
|
|
run_cc_link_tests {
|
|
{"Helper X32 DSO from x86-64 object" "" "-m64 -fPIC -g"
|
|
{simple.c} {} "libsimple.a"}
|
|
}
|
|
|
|
set convertx32 "$objcopy -O elf32-x86-64 tmpdir/simple.o tmpdir/simple-x32.o"
|
|
send_log "$convertx32\n"
|
|
set got [remote_exec host "$convertx32"]
|
|
if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
|
|
send_log "$got\n"
|
|
fail "Convert x86-64 object to x32"
|
|
return
|
|
}
|
|
|
|
run_ld_link_tests {
|
|
{"X32 DSO from x86-64 object"
|
|
"-shared -melf32_x86_64 tmpdir/simple-x32.o" "" "--x32"
|
|
{dummy.s} {{readelf {-s --wide} x86-64-x32.rd}} "x86-64-x32"}
|
|
}
|
|
|
|
run_cc_link_tests [list \
|
|
[list \
|
|
"Build plt-lib.so" \
|
|
"-shared" \
|
|
"-fPIC" \
|
|
{ plt-lib.c } \
|
|
{} \
|
|
"libplt-lib.so" \
|
|
] \
|
|
[list \
|
|
"Build libplt-main1.a" \
|
|
"" \
|
|
"-fPIC" \
|
|
{ plt-main1.c } \
|
|
{{readelf {-Wr} plt-main1.rd}} \
|
|
"libplt-main1.a" \
|
|
] \
|
|
[list \
|
|
"Build libplt-main2.a" \
|
|
"" \
|
|
"-fPIC" \
|
|
{ plt-main2.c } \
|
|
{{readelf {-Wr} plt-main2.rd}} \
|
|
"libplt-main2.a" \
|
|
] \
|
|
[list \
|
|
"Build libplt-main3.a" \
|
|
"" \
|
|
"-fPIC" \
|
|
{ plt-main3.c } \
|
|
{{readelf {-Wr} plt-main3.rd}} \
|
|
"libplt-main3.a" \
|
|
] \
|
|
[list \
|
|
"Build libplt-main4.a" \
|
|
"" \
|
|
"-fPIC" \
|
|
{ plt-main4.c } \
|
|
{{readelf {-Wr} plt-main4.rd}} \
|
|
"libplt-main4.a" \
|
|
] \
|
|
[list \
|
|
"Build plt-main" \
|
|
"tmpdir/plt-main1.o tmpdir/plt-main2.o tmpdir/plt-main3.o \
|
|
tmpdir/plt-main4.o tmpdir/libplt-lib.so" \
|
|
"" \
|
|
{ plt-main5.c } \
|
|
{{readelf {-Wr} plt-main.rd}} \
|
|
"plt-main" \
|
|
] \
|
|
[list \
|
|
"Build plt-main with PIE" \
|
|
"tmpdir/plt-main1.o tmpdir/plt-main2.o tmpdir/plt-main3.o \
|
|
tmpdir/plt-main4.o tmpdir/libplt-lib.so -pie" \
|
|
"-fPIC" \
|
|
{ plt-main5.c } \
|
|
{{readelf {-Wr} plt-main.rd}} \
|
|
"plt-main" \
|
|
] \
|
|
]
|
|
|
|
run_ld_link_exec_tests [] [list \
|
|
[list \
|
|
"Run plt-main" \
|
|
"tmpdir/plt-main1.o tmpdir/plt-main2.o tmpdir/plt-main3.o \
|
|
tmpdir/plt-main4.o tmpdir/libplt-lib.so" \
|
|
"" \
|
|
{ plt-main5.c } \
|
|
"plt-main" \
|
|
"plt-main.out" \
|
|
] \
|
|
[list \
|
|
"Run plt-main with PIE" \
|
|
"tmpdir/plt-main1.o tmpdir/plt-main2.o tmpdir/plt-main3.o \
|
|
tmpdir/plt-main4.o tmpdir/libplt-lib.so -pie" \
|
|
"" \
|
|
{ plt-main5.c } \
|
|
"plt-main-pie" \
|
|
"plt-main.out" \
|
|
"-fPIC" \
|
|
] \
|
|
]
|
|
|
|
if { [istarget "x86_64-*-linux*"] \
|
|
&& ![istarget "x86_64-*-linux*-gnux32"]} {
|
|
|
|
run_cc_link_tests [list \
|
|
[list \
|
|
"Build plt-main with -z bndplt" \
|
|
"tmpdir/plt-main1.o tmpdir/plt-main2.o tmpdir/plt-main3.o \
|
|
tmpdir/plt-main4.o tmpdir/libplt-lib.so -z bndplt" \
|
|
"" \
|
|
{ plt-main5.c } \
|
|
{{objdump {-drw} plt-main-bnd.dd}} \
|
|
"plt-main-bnd" \
|
|
] \
|
|
[list \
|
|
"Build plt-main with PIE and -z bndplt" \
|
|
"tmpdir/plt-main1.o tmpdir/plt-main2.o tmpdir/plt-main3.o \
|
|
tmpdir/plt-main4.o tmpdir/libplt-lib.so -z bndplt -pie" \
|
|
"-fPIC" \
|
|
{ plt-main5.c } \
|
|
{{objdump {-drw} plt-main-bnd.dd}} \
|
|
"plt-main-pie-bnd" \
|
|
] \
|
|
]
|
|
|
|
run_ld_link_exec_tests [] [list \
|
|
[list \
|
|
"Run plt-main with -z bndplt" \
|
|
"tmpdir/plt-main1.o tmpdir/plt-main2.o tmpdir/plt-main3.o \
|
|
tmpdir/plt-main4.o tmpdir/libplt-lib.so -z bndplt" \
|
|
"" \
|
|
{ plt-main5.c } \
|
|
"plt-main-bnd" \
|
|
"plt-main.out" \
|
|
] \
|
|
[list \
|
|
"Run plt-main with PIE and -z bndplt" \
|
|
"tmpdir/plt-main1.o tmpdir/plt-main2.o tmpdir/plt-main3.o \
|
|
tmpdir/plt-main4.o tmpdir/libplt-lib.so -z bndplt -pie" \
|
|
"" \
|
|
{ plt-main5.c } \
|
|
"plt-main-pie-bnd" \
|
|
"plt-main.out" \
|
|
"-fPIC" \
|
|
] \
|
|
]
|
|
}
|
|
}
|
|
|
|
if { ![istarget "x86_64-*-linux*"]} {
|
|
return
|
|
}
|
|
|
|
# Linux only tests
|
|
run_dump_test "pr17618"
|