binutils-gdb/ld/testsuite/ld-i386/i386.exp
H.J. Lu abfa390dac Check the DYNAMIC bit for input shared objects
Since the BFD section count may not be cleared for shared objects during
linking, we should check the DYNAMIC bit for input shared objects.

bfd/

	PR ld/21626
	* elf-properties.c (_bfd_elf_link_setup_gnu_properties): Check
	the DYNAMIC bit instead of bfd_count_sections.

ld/

	PR ld/21626
	* testsuite/ld-i386/i386.exp: Run ld/21626 tests.
	* testsuite/ld-x86-64/x86-64.exp: Likewise.
2017-06-19 20:30:20 -07:00

1209 lines
30 KiB
Plaintext

# Expect script for ld-i386 tests
# Copyright (C) 2002-2017 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 i386 linking; all types of relocs. This tests the assembler and
# tools like objdump as well as the linker.
if {[istarget "i?86-*-vxworks"]} {
set i386tests {
{"VxWorks shared library test 1" "-shared -Tvxworks1.ld" ""
"" {vxworks1-lib.s}
{{readelf --relocs vxworks1-lib.rd} {objdump -dr vxworks1-lib.dd}
{readelf --symbols vxworks1-lib.nd} {readelf -d vxworks1-lib.td}}
"libvxworks1.so"}
{"VxWorks executable test 1 (dynamic)" \
"tmpdir/libvxworks1.so -Tvxworks1.ld -q --force-dynamic" ""
"" {vxworks1.s}
{{readelf --relocs vxworks1.rd} {objdump -dr vxworks1.dd}}
"vxworks1"}
{"VxWorks executable test 2 (dynamic)" \
"-Tvxworks1.ld -q --force-dynamic" ""
"" {vxworks2.s}
{{readelf --segments vxworks2.sd}}
"vxworks2"}
{"VxWorks executable test 2 (static)"
"-Tvxworks1.ld" ""
"" {vxworks2.s}
{{readelf --segments vxworks2-static.sd}}
"vxworks2"}
}
run_ld_link_tests $i386tests
run_dump_test "vxworks1-static"
}
if [istarget "*-*-go32*"] {
run_ld_link_tests {{"go32 stub" "" "" "" {zero.s} {} "go32stub"}}
set src "tmpdir/go32stub"
set dest "tmpdir/go32stub-copy"
set test "go32 stub patch the source"
set fi [open $src r+]
fconfigure $fi -translation binary
if {[read $fi 2] != "MZ"} {
fail $test
} else {
pass $test
seek $fi 0x40
puts -nonewline $fi "objcopy-test-go32stub"
}
close $fi
set test "go32 stub objcopy"
set status [remote_exec build $OBJCOPY "$OBJCOPYFLAGS $src $dest"]
set exec_output [lindex $status 1]
set exec_output [prune_warnings $exec_output]
if [string match "" $exec_output] then {
pass $test
} else {
send_log "$exec_output\n"
verbose "$exec_output" 1
fail $test
}
# cmp would compare the whole files and some data after the initial exe
# stub could differ.
set test "go32 stub comparison after objcopy"
set fi [open $src]
fconfigure $fi -translation binary
set src_stub [read $fi 2048]
close $fi
set fi [open $dest]
fconfigure $fi -translation binary
set dest_stub [read $fi 2048]
close $fi
if {$src_stub == $dest_stub} {
pass $test
} else {
fail $test
}
}
if { !([istarget "i?86-*-elf*"]
|| (([istarget "i?86-*-linux*"]
|| [istarget "i?86-*-gnu*"])
&& ![istarget "*-*-*aout*"]
&& ![istarget "*-*-*oldld*"])
|| [istarget "i?86-*-nacl*"]
|| [istarget "x86_64-*-nacl*"]
|| [istarget "x86_64-*-linux*"]
|| [istarget "amd64-*-linux*"]) } {
return
}
# 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 i386tests {
{"Helper shared library (basic PLT test)"
"-shared -melf_i386" "" "--32" {pltlib.s} {} "libpltlib.so"}
{"basic PLT generation (non-PIC)"
"-melf_i386 tmpdir/libpltlib.so" "" "--32" {plt.s}
{{objdump -drj.plt plt.pd}} "plt"}
{"basic PLT generation (PIC)"
"-shared -melf_i386 tmpdir/libpltlib.so" "" "--32" {plt-pic.s}
{{objdump -drj.plt plt-pic.pd}} "libplt-pic.so"}
{"TLS -fpic -shared transitions"
"-shared -melf_i386 --no-ld-generated-unwind-info" ""
"--32" {tlspic1.s tlspic2.s}
{{readelf -Ssrl tlspic.rd} {objdump -drj.text tlspic.dd}
{objdump -sj.got tlspic.sd} {objdump -sj.tdata tlspic.td}}
"libtlspic.so"}
{"TLS -fpic -shared transitions without PLT"
"-shared -melf_i386 --no-ld-generated-unwind-info" ""
"-mrelax-relocations=yes --32"
{tlspic3.s tlspic2.s}
{{readelf -Ssrl tlspic2.rd} {objdump -drj.text tlspic2.dd}
{objdump -sj.got tlspic2.sd} {objdump -sj.tdata tlspic2.td}}
"libtlspic2.so"}
{"TLS descriptor -fpic -shared transitions"
"-shared -melf_i386 --no-ld-generated-unwind-info" ""
"--32" {tlsdesc.s tlspic2.s}
{{readelf -Ssrl tlsdesc.rd} {objdump -drj.text tlsdesc.dd}
{objdump "-s -j.got -j.got.plt" tlsdesc.sd} {objdump -sj.tdata tlsdesc.td}}
"libtlsdesc.so"}
{"Helper shared library" "-shared -melf_i386" ""
"--32" {tlslib.s} {} "libtlslib.so"}
{"TLS -fpic and -fno-pic exec transitions"
"-melf_i386 tmpdir/libtlslib.so --no-ld-generated-unwind-info" ""
"--32" {tlsbinpic.s tlsbin.s}
{{readelf -Ssrl tlsbin.rd} {objdump -drj.text tlsbin.dd}
{objdump -sj.got tlsbin.sd} {objdump -sj.tdata tlsbin.td}}
"tlsbin"}
{"TLS -fpic and -fno-pic exec transitions without PLT"
"-melf_i386 tmpdir/libtlslib.so --no-ld-generated-unwind-info" ""
"-mrelax-relocations=yes --32"
{tlsbinpic2.s tlsbin.s}
{{readelf -Ssrl tlsbin2.rd} {objdump -drj.text tlsbin2.dd}
{objdump -sj.got tlsbin2.sd} {objdump -sj.tdata tlsbin2.td}}
"tlsbin2"}
{"TLS descriptor -fpic and -fno-pic exec transitions"
"-melf_i386 tmpdir/libtlslib.so --no-ld-generated-unwind-info" ""
"--32" {tlsbindesc.s tlsbin.s}
{{readelf -Ssrl tlsbindesc.rd} {objdump -drj.text tlsbindesc.dd}
{objdump -sj.got tlsbindesc.sd} {objdump -sj.tdata tlsbindesc.td}}
"tlsbindesc"}
{"TLS -fno-pic -shared"
"-shared -melf_i386 --no-ld-generated-unwind-info" ""
"--32" {tlsnopic1.s tlsnopic2.s}
{{readelf -Ssrl tlsnopic.rd} {objdump -drj.text tlsnopic.dd}
{objdump -sj.got tlsnopic.sd}} "libtlsnopic.so"}
{"TLS with global dynamic and descriptors"
"-shared -melf_i386 --no-ld-generated-unwind-info" ""
"--32" {tlsgdesc.s}
{{readelf -Ssrl tlsgdesc.rd} {objdump -drj.text tlsgdesc.dd}}
"libtlsgdesc.so"}
{"TLS in debug sections" "-melf_i386" ""
"--32" {tlsg.s}
{{objdump -sj.debug_foobar tlsg.sd}} "tlsg"}
{"TLS @indntpoff with %eax" "-melf_i386" "" "--32" {tlsindntpoff.s}
{{objdump -drj.text tlsindntpoff.dd}} "tlsindntpoff"}
{"Reloc section order" "-shared -melf_i386 -z nocombreloc" "" "--32"
{reloc.s} {{objdump -hw reloc.d}} "reloc.so"}
{"Basic --emit-relocs support" "-shared -melf_i386 --emit-relocs" "" "--32"
{emit-relocs.s} {{readelf --relocs emit-relocs.rd}} "emit-relocs.so"}
{"-z combreloc relocation sections" "-shared -melf_i386 -z combreloc" ""
"--32" {combreloc.s} {{readelf -r combreloc.d}} "combreloc.so"}
{"TLS GD->LE transition" "-melf_i386" ""
"--32" {tlsgd1.s}
{{objdump -dwr tlsgd1.dd}} "tlsgd1"}
{"TLS GD->LE transition without PLT" "-melf_i386" ""
"-mrelax-relocations=yes --32"
{tlsgd3.s}
{{objdump -dwr tlsgd3.dd}} "tlsgd3"}
{"TLS LD->LE transition" "-melf_i386" ""
"--32" {tlsld1.s}
{{objdump -dwr tlsld1.dd}} "tlsld1"}
{"TLS LD->LE transition without PLT" "-melf_i386" ""
"-mrelax-relocations=yes --32"
{tlsld2.s}
{{objdump -dwr tlsld2.dd}} "tlsld2"}
{"TLS IE->LE transition" "-melf_i386" ""
"--32" {tlsie1.s}
{{objdump -dwr tlsie1.dd}} "tlsie1"}
{"PR ld/17313 (1)" "-melf_i386" ""
"--32" {zero.s} {} ""}
{"PR ld/17313 (2)" "-melf_i386 -shared --just-symbols=tmpdir/zero.o" ""
"--32" {lea1.s} {} "libpr17313.so"}
{"PR ld/17306 (1)" "-melf_i386" ""
"--32" {pr17306b.s} {} ""}
{"PR ld/17306 (2)" "-melf_i386 -shared -Bsymbolic --just-symbols=tmpdir/pr17306b.o" ""
"--32" {pr17306a.s} {} "libpr17306.so"}
{"PR ld/17709 (1)" "-melf_i386 -shared" ""
"--32" {pr17709a.s} {} "libpr17709.so"}
{"PR ld/17709 (2)" "-melf_i386 tmpdir/libpr17709.so" ""
"--32" {pr17709b.s} {{readelf -r pr17709.rd}} "pr17709"}
{"Build pr19827a.o" "" ""
"--32" { pr19827a.S }}
{"Build pr19827b.so" "-melf_i386 -shared" ""
"--32" { pr19827b.S } {} "pr19827b.so"}
{"Build pr19827" "-melf_i386 -pie tmpdir/pr19827a.o tmpdir/pr19827b.so" ""
"--32" { dummy.s } {{readelf {-rW} pr19827.rd}} "pr19827"}
{"Build pr19827.so" "-melf_i386 -shared -Bsymbolic" ""
"--32" { pr19827a.S } {{readelf {-rW} pr19827.rd}} "pr19827.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*"] {
# Change all the -melf_i386 to -melf_i386_nacl so linking can succeed.
regsub -all elf_i386 $i386tests elf_i386_nacl i386tests
# Same, applied to all the run_dump_test cases.
set options_regsub(ld) {elf_i386 elf_i386_nacl}
# 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} $i386tests {\1-nacl.rd} i386tests
# Likewise for PLTs.
regsub -all -- {([a-z0-9]+)\.pd} $i386tests {\1-nacl.pd} i386tests
}
proc iamcu_tests {} {
if {[istarget "*-*-nacl*"]} then {
return
}
global as
global srcdir
global subdir
if ![ld_assemble $as "--32 -march=iamcu $srcdir/$subdir/start.s" tmpdir/startiamcu.o] {
unresolved "Build Intel MCU 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 "--32 -march=iamcu $srcdir/$subdir/foo.s" tmpdir/fooiamcu.o] {
unresolved "Build Intel MCU foo.o"
return
}
if ![ld_assemble $as "--32 $srcdir/$subdir/foo.s" tmpdir/foo32.o] {
unresolved "Build ia32 foo.o"
return
}
run_dump_test "abs-iamcu"
run_dump_test "iamcu-1"
run_dump_test "iamcu-2"
run_dump_test "iamcu-3"
run_dump_test "iamcu-4"
}
iamcu_tests
run_ld_link_tests $i386tests
run_dump_test "abs"
run_dump_test "pcrel8"
run_dump_test "pcrel16"
run_dump_test "pcrel16abs"
run_dump_test "alloc"
run_dump_test "warn1"
run_dump_test "tlsgd2"
run_dump_test "tlsgd4"
run_dump_test "tlsie2"
run_dump_test "tlsie3"
run_dump_test "tlsie4"
run_dump_test "tlsie5"
run_dump_test "hidden1"
run_dump_test "hidden2"
run_dump_test "hidden3"
run_dump_test "protected1"
run_dump_test "protected2"
run_dump_test "protected3"
run_dump_test "protected4"
run_dump_test "protected5"
run_dump_test "protected6a"
run_dump_test "protected6b"
run_dump_test "tlspie1"
run_dump_test "tlspie2"
run_dump_test "tlspie3a"
run_dump_test "tlspie3b"
run_dump_test "tlspie3c"
run_dump_test "nogot1"
run_dump_test "nogot2"
run_dump_test "discarded1"
run_dump_test "pr12718"
run_dump_test "pr12921"
run_dump_test "pr12570a"
run_dump_test "pr12570b"
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 "mov1a"
run_dump_test "mov1b"
run_dump_test "mov2a"
run_dump_test "mov2b"
run_dump_test "mov3"
run_dump_test "branch1"
run_dump_test "call1"
run_dump_test "call2"
run_dump_test "call3a"
run_dump_test "call3b"
run_dump_test "call3c"
run_dump_test "call3d"
run_dump_test "call3e"
run_dump_test "call3f"
run_dump_test "call3g"
run_dump_test "call3h"
run_dump_test "jmp1"
run_dump_test "jmp2"
run_dump_test "load1"
run_dump_test "load1-nacl"
run_dump_test "load2"
run_dump_test "load3"
run_dump_test "load4a"
run_dump_test "load4b"
run_dump_test "load5a"
run_dump_test "load5b"
run_dump_test "load6"
run_dump_test "load7"
run_dump_test "pr19175"
run_dump_test "pr19615"
run_dump_test "pr19636-1a"
run_dump_test "pr19636-1b"
run_dump_test "pr19636-1c"
run_dump_test "pr19636-1d"
run_dump_test "pr19636-1d-nacl"
run_dump_test "pr19636-1e"
run_dump_test "pr19636-1f"
run_dump_test "pr19636-1g"
run_dump_test "pr19636-1h"
run_dump_test "pr19636-1i"
run_dump_test "pr19636-2a"
run_dump_test "pr19636-2b"
run_dump_test "pr19636-2c"
run_dump_test "pr19636-2c-nacl"
run_dump_test "pr19636-2d"
run_dump_test "pr19636-2d-nacl"
run_dump_test "pr19636-2e"
run_dump_test "pr19636-2e-nacl"
run_dump_test "pr19636-3a"
run_dump_test "pr19636-3b"
run_dump_test "pr19636-3c"
run_dump_test "pr19636-3d"
run_dump_test "pr19636-3e"
run_dump_test "pr19636-3f"
run_dump_test "pr19636-3g"
run_dump_test "pr19636-4a"
run_dump_test "pr19636-4b"
run_dump_test "pr19636-4c"
run_dump_test "pr19636-4d"
run_dump_test "pr19645"
run_dump_test "pr19609-1a"
run_dump_test "pr19609-1b"
run_dump_test "pr19609-1c"
run_dump_test "pr19609-1d"
run_dump_test "pr19609-1e"
run_dump_test "pr19609-1f"
run_dump_test "pr19609-1g"
run_dump_test "pr19609-1h"
run_dump_test "pr19609-1i"
run_dump_test "pr19609-2a"
run_dump_test "pr19609-2b"
run_dump_test "pr19609-2c"
run_dump_test "undefweaka"
run_dump_test "undefweakb"
run_dump_test "pr19539"
run_dump_test "pr20117"
run_dump_test "pr20244-1a"
run_dump_test "pr20244-1b"
run_dump_test "pr20244-1c"
run_dump_test "pr20244-2a"
run_dump_test "pr20244-2b"
run_dump_test "pr20244-2c"
run_dump_test "pr20244-2d"
run_dump_test "pr20244-4a"
run_dump_test "pr20244-4b"
run_dump_test "pr20244-4c"
run_dump_test "pr20253-3"
run_dump_test "pr20253-4a"
run_dump_test "pr20253-4b"
run_dump_test "pr20253-4c"
run_dump_test "pr20253-5"
run_dump_test "pr20515"
run_dump_test "property-x86-3"
run_dump_test "property-x86-4a"
run_dump_test "property-x86-4b"
if { !([istarget "i?86-*-linux*"]
|| [istarget "i?86-*-gnu*"]
|| [istarget "i?86-*-nacl*"]
|| [istarget "x86_64-*-nacl*"]
|| [istarget "x86_64-*-linux*"]) } {
return
}
run_dump_test "compressed1"
run_dump_test "pr12627"
run_dump_test "pr13302"
run_dump_test "pr14215"
run_dump_test "pr17057"
run_dump_test "pr17935-1"
run_dump_test "pr17935-2"
run_dump_test "pr18801"
run_dump_test "pr18815"
run_dump_test "pr19939a"
run_dump_test "pr19939b"
run_dump_test "tlsdesc2"
proc undefined_weak {cflags ldflags} {
set testname "Undefined weak symbol"
if { ![ string match "" $cflags$ldflags] } {
set testname "$testname ($cflags $ldflags)"
}
if { [ regexp "\-fPIE" $cflags]
&& ![ regexp "\-z nodynamic-undefined-weak" $ldflags] } {
set weak_symbol "Weak defined"
} else {
set weak_symbol "Weak undefined"
}
run_cc_link_tests [list \
[list \
"Build libpr19704a.so" \
"-shared -Wl,-soname,libpr19704.so" \
"" \
{ dummy.s } \
{} \
"libpr19704a.so" \
] \
[list \
"Build libpr19704b.so" \
"-shared -Wl,-soname,libpr19704.so" \
"-fPIC" \
{ pr19704b.c } \
{} \
"libpr19704b.so" \
] \
]
exec cp tmpdir/libpr19704a.so tmpdir/libpr19704.so
run_ld_link_exec_tests [list \
[list \
"Run pr19704" \
"$ldflags tmpdir/libpr19704.so -Wl,-R,tmpdir" \
"" \
{ pr19704a.c } \
"pr19704" \
"pr19704.out" \
"$cflags" \
] \
]
exec cp tmpdir/libpr19704b.so tmpdir/libpr19704.so
set exec_output [run_host_cmd tmpdir/pr19704 ""]
if {![string match $weak_symbol $exec_output]} {
fail $testname
} else {
pass $testname
}
}
# Add $PLT_CFLAGS if PLT is expected.
global PLT_CFLAGS
# Must be Linux native with the C compiler
if { [isnative]
&& [istarget "i?86-*-linux*"]
&& [which $CC] != 0 } {
run_cc_link_tests [list \
[list \
"Build plt-lib.so" \
"-shared" \
"-fPIC" \
{ plt-lib.c } \
{} \
"libplt-lib.so" \
] \
[list \
"Build libplt-main1.a" \
"" \
"-fPIC -Wa,-mrelax-relocations=yes" \
{ plt-main1.c } \
{{readelf {-Wr} plt-main1.rd}} \
"libplt-main1.a" \
] \
[list \
"Build libplt-main2.a" \
"" \
"-fPIC -Wa,-mrelax-relocations=yes" \
{ plt-main2.c } \
{{readelf {-Wr} plt-main2.rd}} \
"libplt-main2.a" \
] \
[list \
"Build libplt-main3.a" \
"" \
"-fPIC -Wa,-mrelax-relocations=yes $PLT_CFLAGS" \
{ plt-main3.c } \
{{readelf {-Wr} plt-main3.rd}} \
"libplt-main3.a" \
] \
[list \
"Build libplt-main4.a" \
"" \
"-fPIC -Wa,-mrelax-relocations=yes $PLT_CFLAGS" \
{ 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" \
] \
[list \
"Build copyreloc-lib.so" \
"-shared" \
"-fPIC" \
{ copyreloc-lib.c } \
{} \
"copyreloc-lib.so" \
] \
[list \
"Build libcopyreloc-main.a" \
"" \
"" \
{ copyreloc-main.S } \
{} \
"libcopyreloc-main.a" \
] \
[list \
"Build copyreloc-main with PIE and GOTOFF (1)" \
"tmpdir/copyreloc-main.o tmpdir/copyreloc-lib.so -pie" \
"" \
{ dummy.s } \
{{readelf {-Wr} copyreloc-main1.rd}} \
"copyreloc-main" \
] \
[list \
"Build copyreloc-main with PIE and GOTOFF (2)" \
"tmpdir/copyreloc-main.o tmpdir/copyreloc-lib.so -pie" \
"" \
{ dummy.s } \
{{readelf {-Wr} copyreloc-main2.rd}} \
"copyreloc-main" \
] \
[list \
"Build pr17689.so" \
"-shared" \
"-fPIC" \
{ pr17689a.c } \
{} \
"pr17689.so" \
] \
[list \
"Build pr17689.so with -z now" \
"-shared -Wl,-z,now" \
"-fPIC" \
{ pr17689a.c } \
{{readelf {-Wr} pr17689now.rd}} \
"pr17689now.so" \
] \
[list \
"Build pr17689ver.so" \
"-shared -Wl,--version-script,pr17689a.t" \
"-fPIC" \
{ pr17689a.c } \
{} \
"pr17689ver.so" \
] \
[list \
"Build pr17689.a" \
"" \
"" \
{ pr17689b.S } \
{} \
"pr17689.a" \
] \
[list \
"Build pr17689 with PIE and GOTOFF" \
"tmpdir/pr17689b.o tmpdir/pr17689.so -pie" \
"" \
{ dummy.c } \
{{readelf {-Wr} pr17689.rd}} \
"pr17689" \
] \
[list \
"Build pr17689 with PIE, -z now and GOTOFF" \
"tmpdir/pr17689b.o tmpdir/pr17689.so -pie -Wl,-z,now" \
"" \
{ dummy.c } \
{{readelf {-Wr} pr17689now.rd}} \
"pr17689now" \
] \
[list \
"Build pr17689ver with PIE and GOTOFF" \
"tmpdir/pr17689b.o tmpdir/pr17689ver.so -pie" \
"" \
{ dummy.c } \
{{readelf {-Wr} pr17689ver.rd}} \
"pr17689ver" \
] \
[list \
"Build pr17827 with PIE and GOTOFF" \
"tmpdir/pr17689b.o tmpdir/pr17689.so -pie" \
"" \
{ dummy.c } \
{{readelf {-Wr} pr17827.rd}} \
"pr17827" \
] \
[list \
"Build pr18900.so" \
"-shared" \
"-fPIC" \
{ pr18900a.c } \
"" \
"pr18900.so" \
] \
[list \
"Build pr18900.o" \
"-r -nostdlib" \
"" \
{ pr18900b.c pr18900c.c } \
"" \
"pr18900.o" \
] \
[list \
"Build pr18900a" \
"tmpdir/pr18900.o tmpdir/pr18900.so" \
"" \
{ dummy.s } \
{{readelf {-Wrd} pr18900a.rd}} \
"pr18900a" \
] \
[list \
"Build pr18900b" \
"-Wl,--as-needed tmpdir/pr18900.o tmpdir/pr18900.so" \
"" \
{ dummy.s } \
{{readelf {-Wrd} pr18900b.rd}} \
"pr18900b" \
] \
[list \
"Build pr19031.so" \
"-shared" \
"-fPIC" \
{ pr19031a.c } \
"" \
"pr19031.so" \
] \
[list \
"Build got1d.so" \
"-shared" \
"" \
{ got1d.S } \
"" \
"got1d.so" \
] \
[list \
"Build gotpc1.o" \
"-r -nostdlib" \
"-Wa,-mrelax-relocations=yes" \
{ got1a.S got1b.c got1c.c } \
"" \
"gotpc1.o" \
] \
[list \
"Build gotpc1" \
"-Wl,--as-needed tmpdir/gotpc1.o tmpdir/got1d.so" \
"" \
{ dummy.s } \
{{objdump {-dw} got1.dd}} \
"got1" \
] \
[list \
"Build pr19319.so" \
"-shared" \
"" \
{ pr19319a.S } \
"" \
"pr19319.so" \
] \
[list \
"Build pr19319" \
"-pie -nostdlib -nostartfiles tmpdir/pr19319.so" \
"-Wa,-mrelax-relocations=yes" \
{ pr19319b.S } \
{{objdump {-dw} pr19319.dd}} \
"pr19319" \
] \
[list \
"Build property 1" \
"" \
"" \
{pass.c property-no-copy.S} \
{{readelf {-n} property-1.r}} \
"property-1" \
] \
[list \
"Build property 1 (.o)" \
"-r -nostdlib" \
"" \
{pass.c property-no-copy.S} \
{{readelf {-n} property-1.r}} \
"property-1.o" \
] \
[list \
"Build property 1 (.so)" \
"-shared" \
"-fPIC" \
{pass.c property-no-copy.S} \
{{readelf {-n} property-1.r}} \
"property-1.so" \
] \
[list \
"Build property 2" \
"" \
"" \
{pass.c property-stack.S} \
{{readelf {-n} property-2.r}} \
"property-2" \
] \
[list \
"Build property 2 (.o)" \
"-r -nostdlib" \
"" \
{pass.c property-stack.S} \
{{readelf {-n} property-2.r}} \
"property-2.o" \
] \
[list \
"Build property 2 (.so)" \
"-shared" \
"-fPIC" \
{pass.c property-stack.S} \
{{readelf {-n} property-2.r}} \
"property-2.so" \
] \
[list \
"Build property 3" \
"" \
"" \
{pass.c property-stack.S property-x86-1.S} \
{{readelf {-n} property-3.r}} \
"property-3" \
] \
[list \
"Build property 3 (.o)" \
"-r -nostdlib" \
"" \
{pass.c property-x86-1.S property-stack.S} \
{{readelf {-n} property-3.r}} \
"property-3.o" \
] \
[list \
"Build property 3 (.so)" \
"-shared" \
"-fPIC" \
{property-x86-1.S pass.c property-stack.S} \
{{readelf {-n} property-3.r}} \
"property-3.so" \
] \
[list \
"Build property 4" \
"" \
"" \
{pass.c property-stack.S property-x86-1.S property-x86-2.S} \
{{readelf {-n} property-4.r}} \
"property-4" \
] \
[list \
"Build property 4 (.o)" \
"-r -nostdlib" \
"" \
{pass.c property-x86-2.S property-x86-1.S property-stack.S} \
{{readelf {-n} property-4.r}} \
"property-4.o" \
] \
[list \
"Build property 4 (.so)" \
"-shared" \
"-fPIC" \
{property-x86-2.S property-x86-1.S pass.c property-stack.S} \
{{readelf {-n} property-4.r}} \
"property-4.so" \
] \
[list \
"Build property 4 (-Wl,-z,stack-size=0)" \
"-Wl,-z,stack-size=0" \
"" \
{pass.c property-stack.S property-x86-1.S property-x86-2.S} \
{{readelf {-n} property-4.r}} \
"property-4" \
] \
[list \
"Build property 5" \
"-Wl,-z,stack-size=0x900000" \
"" \
{pass.c property-stack.S property-x86-1.S property-x86-2.S} \
{{readelf {-n} property-5.r}} \
"property-5" \
] \
[list \
"Build property 5 (.o)" \
"-r -nostdlib -Wl,-z,stack-size=0x900000" \
"" \
{pass.c property-x86-2.S property-x86-1.S property-stack.S} \
{{readelf {-n} property-5.r}} \
"property-5.o" \
] \
[list \
"Build property 5 (.so)" \
"-shared -Wl,-z,stack-size=0x900000" \
"-fPIC" \
{property-x86-2.S property-x86-1.S pass.c property-stack.S} \
{{readelf {-n} property-5.r}} \
"property-5.so" \
] \
[list \
"Build property-6.so" \
"-shared" \
"-fPIC" \
{property-6a.c property-6c.S} \
{{readelf {-n} property-6.r}} \
"property-6.so" \
] \
[list \
"Build property-6.o" \
"-r -nostdlib" \
"" \
{property-6b.c property-stack.S} \
{{readelf {-n} property-2.r}} \
"property-6.o" \
] \
[list \
"Build property-6" \
"-Wl,--as-needed tmpdir/property-6.o tmpdir/property-6.so" \
{ dummy.s } \
"" \
{{readelf {-n} property-2.r}} \
"property-6" \
] \
[list \
"Build property 7a (.o)" \
"-r -nostdlib" \
"" \
{property-unsorted-1.S} \
{{readelf {-n} property-7.r}} \
"property-7a.o" \
] \
[list \
"Build property 7b (.o)" \
"-r -nostdlib" \
"" \
{property-unsorted-2.S} \
{{readelf {-n} property-7.r}} \
"property-7b.o" \
] \
]
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" \
] \
[list \
"Run copyreloc-main with PIE and GOTOFF" \
"-Wl,--as-needed tmpdir/copyreloc-main.o tmpdir/copyreloc-lib.so -pie" \
"" \
{ dummy.s } \
"copyreloc-main" \
"copyreloc-main.out" \
] \
[list \
"Run pr17689 with PIE and GOTOFF" \
"tmpdir/pr17689b.o tmpdir/pr17689.so -pie" \
"" \
{ dummy.c } \
"pr17689" \
"pr17689.out" \
] \
[list \
"Run pr17689 with PIE, -z now and GOTOFF" \
"tmpdir/pr17689b.o tmpdir/pr17689.so -pie -z now" \
"" \
{ dummy.c } \
"pr17689now" \
"pr17689.out" \
] \
[list \
"Run pr17689ver with PIE and GOTOFF" \
"tmpdir/pr17689b.o tmpdir/pr17689ver.so -pie" \
"" \
{ dummy.c } \
"pr17689ver" \
"pr17689.out" \
] \
[list \
"Run pr18900" \
"tmpdir/pr18900.o tmpdir/pr18900.so" \
"" \
{ dummy.s } \
"pr18900" \
"pr18900.out" \
] \
[list \
"Run pr19031" \
"tmpdir/pr19031.so" \
"" \
{ pr19031b.S pr19031c.c } \
"pr19031" \
"pr19031.out" \
] \
[list \
"Run got1" \
"tmpdir/got1d.so" \
"" \
{ got1a.S got1b.c got1c.c } \
"got1" \
"got1.out" \
] \
[list \
"Run property 1" \
"" \
"" \
{pass.c property-no-copy.S} \
"property-1" "pass.out" \
] \
[list \
"Run property 1 (PIE)" \
"-pie" \
"" \
{pass.c property-no-copy.S} \
"property-1-pie" "pass.out" "-fPIE" \
] \
[list \
"Run property 1 (static)" \
"-static" \
"" \
{pass.c property-no-copy.S} \
"property-1-static" "pass.out" \
] \
[list \
"Run property 2" \
"" \
"" \
{pass.c property-stack.S} \
"property-2" "pass.out" \
] \
[list \
"Run property 2 (PIE)" \
"-pie" \
"" \
{pass.c property-stack.S} \
"property-2-pie" "pass.out" "-fPIE" \
] \
[list \
"Run property 2 (static)" \
"-static" \
"" \
{pass.c property-stack.S} \
"property-3-static" "pass.out" \
] \
[list \
"Run property 3" \
"" \
"" \
{pass.c property-stack.S property-x86-1.S} \
"property-3" "pass.out" \
] \
[list \
"Run property 3 (PIE)" \
"-pie" \
"" \
{pass.c property-x86-1.S property-stack.S} \
"property-3-pie" "pass.out" "-fPIE" \
] \
[list \
"Run property 3 (static)" \
"-static" \
"" \
{property-x86-1.S pass.c property-stack.S} \
"property-3-static" "pass.out" \
] \
[list \
"Run property 4" \
"" \
"" \
{pass.c property-stack.S property-x86-1.S property-x86-2.S} \
"property-4" "pass.out" \
] \
[list \
"Run property 4 (PIE)" \
"-pie" \
"" \
{pass.c property-x86-2.S property-x86-1.S property-stack.S} \
"property-4-pie" "pass.out" "-fPIE" \
] \
[list \
"Run property 4 (static)" \
"-static" \
"" \
{property-x86-2.S property-x86-1.S pass.c property-stack.S} \
"property-4-static" "pass.out" \
] \
[list \
"Run property 5" \
"-Wl,-z,stack-size=0x900000" \
"" \
{pass.c property-stack.S property-x86-1.S property-x86-2.S} \
"property-5" "pass.out" \
] \
[list \
"Run property 5 (PIE)" \
"-pie -Wl,-z,stack-size=0x900000" \
"" \
{pass.c property-x86-2.S property-x86-1.S property-stack.S} \
"property-5-pie" "pass.out" "-fPIE" \
] \
[list \
"Run property 5 (static)" \
"-static -Wl,-z,stack-size=0x900000" \
"" \
{property-x86-2.S property-x86-1.S pass.c property-stack.S} \
"property-5-static" "pass.out" \
] \
]
undefined_weak "" ""
undefined_weak "-fPIE" ""
undefined_weak "-fPIE" "-pie"
undefined_weak "-fPIE" "-z nodynamic-undefined-weak"
undefined_weak "-fPIE" "-pie -z nodynamic-undefined-weak"
}
# Must be native with the C compiler and working IFUNC support,
if { [isnative]
&& [check_ifunc_available]
&& [istarget "i?86-*-*"]
&& [which $CC] != 0 } {
run_cc_link_tests [list \
[list \
"Build ifunc-1a.o ifunc-1b.o ifunc-1c.o ifunc-1d.o" \
"" \
"-fPIC -O2 -g" \
{ ifunc-1a.c ifunc-1b.S ifunc-1c.S ifunc-1d.S } \
] \
[list \
"Build pr21168a.o" \
"" \
"" \
{ pr21168a.c } \
] \
[list \
"Build pr21168.so" \
"-shared" \
"" \
{ pr21168b.S } \
"" \
"pr21168.so" \
] \
]
run_ld_link_exec_tests [list \
[list \
"Run ifunc-1a" \
"tmpdir/ifunc-1a.o tmpdir/ifunc-1b.o \
tmpdir/ifunc-1c.o tmpdir/ifunc-1d.o" \
"" \
{ dummy.c } \
"ifunc-1a" \
"pass.out" \
] \
[list \
"Run ifunc-1b" \
"--static tmpdir/ifunc-1a.o tmpdir/ifunc-1b.o \
tmpdir/ifunc-1c.o tmpdir/ifunc-1d.o" \
"" \
{ dummy.c } \
"ifunc-1b" \
"pass.out" \
] \
[list \
"Run pr21168" \
"tmpdir/pr21168a.o tmpdir/pr21168.so" \
"" \
{ dummy.c } \
"pr21168" \
"pass.out" \
] \
]
}
if { !([istarget "i?86-*-linux*"]
|| [istarget "x86_64-*-linux*"]) } {
return
}
run_ld_link_tests [list \
[list \
"basic PLT generation (non-PIC, -z now)" \
"-z now -melf_i386 tmpdir/libpltlib.so" \
"" \
"--32" \
{plt2.s} \
{{readelf -SW plt2.rd} {objdump -dwr plt2.dd}} \
"plt2" \
] \
[list \
"basic PLT generation (PIC, -z now)" \
"-z now -shared -melf_i386 tmpdir/libpltlib.so" \
"" \
"--32" \
{plt-pic.s} \
{{objdump -dwr plt-pic2.dd}} \
"plt-pic2.so" \
] \
[list \
"Build pr21626.so" \
"-shared -melf_i386" \
"" \
"--32" \
{property-x86-3.s} \
"" \
"pr21626.so" \
] \
[list \
"Build pr21626" \
"-melf_i386 tmpdir/pr21626.so" \
"" \
"--32" \
{start.s foo.s} \
"" \
"pr21626" \
] \
]
# Linux only tests
run_dump_test "pltgot-1"
run_dump_test "pltgot-2"
run_dump_test "pr20830"