470 lines
14 KiB
Text
470 lines
14 KiB
Text
# Expect script for simple native Linux/x86 tests.
|
|
# Copyright (C) 2018-2022 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.
|
|
#
|
|
|
|
# Linux/x86 tests.
|
|
if { ![istarget "i?86-*-linux*"] \
|
|
&& ![istarget "x86_64-*-linux*"] \
|
|
&& ![istarget "amd64-*-linux*"] } {
|
|
return
|
|
}
|
|
|
|
run_ld_link_tests [list \
|
|
[list \
|
|
"Build pr24920.so" \
|
|
"-shared" \
|
|
"" \
|
|
"" \
|
|
{dummy.s} \
|
|
{} \
|
|
"pr24920.so" \
|
|
] \
|
|
[list \
|
|
"Build pr24920" \
|
|
"-static " \
|
|
"-Bdynamic tmpdir/pr24920.so" \
|
|
"" \
|
|
{start.s} \
|
|
{{ld pr24920.err}} \
|
|
"pr24920" \
|
|
] \
|
|
]
|
|
|
|
# Test very simple native Linux/x86 programs with linux-x86.S.
|
|
run_ld_link_exec_tests [list \
|
|
[list \
|
|
"Run PR ld/23428 test" \
|
|
"--no-dynamic-linker -z separate-code -z noexecstack" \
|
|
"" \
|
|
{ linux-x86.S pr23428.c dummy.s } \
|
|
"pr23428" \
|
|
"pass.out" \
|
|
"$NOPIE_CFLAGS $NOSANITIZE_CFLAGS -fno-asynchronous-unwind-tables" \
|
|
"asm" \
|
|
] \
|
|
]
|
|
|
|
run_ld_link_tests [list \
|
|
[list \
|
|
"Build x86-feature-1" \
|
|
"-z separate-code -z shstk" \
|
|
"" \
|
|
"-mx86-used-note=yes" \
|
|
{ start.s } \
|
|
{{readelf -n x86-feature-1a.rd}} \
|
|
"x86-feature-1" \
|
|
] \
|
|
]
|
|
|
|
run_cc_link_tests [list \
|
|
[list \
|
|
"Build indirect-extern-access-1.so" \
|
|
"-shared -z noexecstack" \
|
|
"-fPIC" \
|
|
{ indirect-extern-access-1a.c } \
|
|
{} \
|
|
"indirect-extern-access-1.so" \
|
|
] \
|
|
[list \
|
|
"Build indirect-extern-access-1a without PIE" \
|
|
"$NOPIE_LDFLAGS -Wl,--no-as-needed -z noexecstack \
|
|
tmpdir/indirect-extern-access-1.so" \
|
|
"$NOPIE_CFLAGS" \
|
|
{ indirect-extern-access.S indirect-extern-access-1b.c } \
|
|
{{readelf -rn indirect-extern-access-1.rd}} \
|
|
"indirect-extern-access-1a" \
|
|
] \
|
|
[list \
|
|
"Build indirect-extern-access-2.so" \
|
|
"-shared" \
|
|
"-fPIC" \
|
|
{ indirect-extern-access-2a.c } \
|
|
{} \
|
|
"indirect-extern-access-2.so" \
|
|
] \
|
|
[list \
|
|
"Build indirect-extern-access-2a without PIE" \
|
|
"$NOPIE_LDFLAGS -Wl,--no-as-needed -z noexecstack \
|
|
tmpdir/indirect-extern-access-2.so" \
|
|
"$NOPIE_CFLAGS" \
|
|
{ indirect-extern-access.S indirect-extern-access-1b.c } \
|
|
{{readelf -rn indirect-extern-access-2.rd}} \
|
|
"indirect-extern-access-2a" \
|
|
] \
|
|
[list \
|
|
"Build indirect-extern-access-2b with PIE" \
|
|
"-pie -Wl,--no-as-needed -z noexecstack \
|
|
tmpdir/indirect-extern-access-2.so" \
|
|
"-fpie" \
|
|
{ indirect-extern-access.S indirect-extern-access-2b.c } \
|
|
{{readelf -rn indirect-extern-access-3.rd}} \
|
|
"indirect-extern-access-2b" \
|
|
] \
|
|
[list \
|
|
"Build pr28158.so" \
|
|
"-shared -Wl,-version-script,pr27128.t" \
|
|
"-fPIC" \
|
|
{ pr28158-1.c } \
|
|
{} \
|
|
"pr28158.so" \
|
|
] \
|
|
[list \
|
|
"Build pr28158" \
|
|
"$NOPIE_LDFLAGS -Wl,--no-as-needed \
|
|
tmpdir/pr28158.so" \
|
|
"" \
|
|
{ pr28158-2.S } \
|
|
{{readelf {--dyn-syms -W} pr28158.rd} {nm -D pr28158.nd}} \
|
|
"pr28158" \
|
|
] \
|
|
[list \
|
|
"Build pr29377.o" \
|
|
"-r -nostdlib -Wl,-z,noexecstack" \
|
|
"" \
|
|
{pr29377a.c indirect-extern-access.S} \
|
|
{} \
|
|
"pr29377.o" \
|
|
] \
|
|
[list \
|
|
"Build pr29377" \
|
|
"$NOPIE_LDFLAGS tmpdir/pr29377.o" \
|
|
"-fPIC" \
|
|
{pr29377b.c} \
|
|
{} \
|
|
"pr29377" \
|
|
] \
|
|
]
|
|
|
|
run_ld_link_exec_tests [list \
|
|
[list \
|
|
"Run indirect-extern-access-1a without PIE" \
|
|
"$NOPIE_LDFLAGS -z noexecstack" \
|
|
"" \
|
|
{ indirect-extern-access.S indirect-extern-access-1b.c } \
|
|
"indirect-extern-access-1a" \
|
|
"pass.out" \
|
|
"$NOPIE_CFLAGS" \
|
|
"" \
|
|
"" \
|
|
"tmpdir/indirect-extern-access-1.so" \
|
|
] \
|
|
[list \
|
|
"Run indirect-extern-access-1b with PIE" \
|
|
"-pie -z noexecstack" \
|
|
"" \
|
|
{ indirect-extern-access.S indirect-extern-access-1b.c } \
|
|
"indirect-extern-access-1b" \
|
|
"pass.out" \
|
|
"-fpie" \
|
|
"" \
|
|
"" \
|
|
"tmpdir/indirect-extern-access-1.so" \
|
|
] \
|
|
[list \
|
|
"Run indirect-extern-access-2a without PIE" \
|
|
"$NOPIE_LDFLAGS -z noexecstack" \
|
|
"" \
|
|
{ indirect-extern-access.S indirect-extern-access-2b.c } \
|
|
"indirect-extern-access-2a" \
|
|
"pass.out" \
|
|
"$NOPIE_CFLAGS" \
|
|
"" \
|
|
"" \
|
|
"tmpdir/indirect-extern-access-2.so" \
|
|
] \
|
|
[list \
|
|
"Run indirect-extern-access-2b with PIE" \
|
|
"-pie -z noexecstack" \
|
|
"" \
|
|
{ indirect-extern-access.S indirect-extern-access-2b.c } \
|
|
"indirect-extern-access-2b" \
|
|
"pass.out" \
|
|
"-fpie" \
|
|
"" \
|
|
"" \
|
|
"tmpdir/indirect-extern-access-2.so" \
|
|
] \
|
|
]
|
|
|
|
# Old gcc silently ignores __attribute__ ((aligned())) with too big alignment.
|
|
proc compiler_honours_aligned { } {
|
|
global CC_FOR_TARGET READELF srcdir subdir
|
|
ld_compile $CC_FOR_TARGET $srcdir/$subdir/p_align-1.c tmpdir/p_align-1.o
|
|
set output [run_host_cmd "$READELF" "-SW tmpdir/p_align-1.o"]
|
|
if { [regexp { [.]data *PROGBITS .* 8388608[\n]} $output] } {
|
|
return 1
|
|
}
|
|
return 0
|
|
}
|
|
|
|
if { [check_compiler_available] && [compiler_honours_aligned] } {
|
|
run_ld_link_exec_tests [list \
|
|
[list \
|
|
"Run p_align-1a without PIE" \
|
|
"$NOPIE_LDFLAGS" \
|
|
"" \
|
|
{ p_align-1.c } \
|
|
"p_align-1a" \
|
|
"pass.out" \
|
|
"$NOPIE_CFLAGS" \
|
|
] \
|
|
[list \
|
|
"Run p_align-1b with PIE" \
|
|
"-pie" \
|
|
"" \
|
|
{ p_align-1.c } \
|
|
"p_align-1b" \
|
|
"pass.out" \
|
|
"-fpie" \
|
|
] \
|
|
[list \
|
|
"Run p_align-1c with -Wl,-z,max-page-size=0x1000 without PIE" \
|
|
"$NOPIE_LDFLAGS -Wl,-z,max-page-size=0x1000" \
|
|
"" \
|
|
{ p_align-1.c } \
|
|
"p_align-1c" \
|
|
"pass.out" \
|
|
"$NOPIE_CFLAGS" \
|
|
] \
|
|
[list \
|
|
"Run p_align-1d with -Wl,-z,max-page-size=0x1000 with PIE" \
|
|
"-pie -Wl,-z,max-page-size=0x1000" \
|
|
"" \
|
|
{ p_align-1.c } \
|
|
"p_align-1d" \
|
|
"pass.out" \
|
|
"-fpie" \
|
|
] \
|
|
]
|
|
} else {
|
|
unsupported "p_align-1"
|
|
}
|
|
|
|
proc elfedit_test { options test output } {
|
|
global ELFEDIT
|
|
global READELF
|
|
global srcdir
|
|
global subdir
|
|
|
|
set test_name "elfedit $options"
|
|
send_log "$ELFEDIT $options tmpdir/$test\n"
|
|
set got [remote_exec host "$ELFEDIT $options tmpdir/$test" "" "/dev/null"]
|
|
if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
|
|
send_log "$got\n"
|
|
fail "$test_name"
|
|
}
|
|
send_log "$READELF -n $options tmpdir/$test > tmpdir/$output.out\n"
|
|
set got [remote_exec host "$READELF -n tmpdir/$test" "" "/dev/null" "tmpdir/$output.out"]
|
|
if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
|
|
send_log "$got\n"
|
|
fail "$test_name"
|
|
}
|
|
if { [regexp_diff tmpdir/$output.out $srcdir/$subdir/$output.rd] } then {
|
|
fail "$test_name"
|
|
} else {
|
|
pass "$test_name"
|
|
}
|
|
}
|
|
|
|
elfedit_test "--enable-x86-feature ibt --disable-x86-feature shstk" \
|
|
x86-feature-1 x86-feature-1b
|
|
elfedit_test "--enable-x86-feature ibt" x86-feature-1 x86-feature-1b
|
|
elfedit_test "--disable-x86-feature shstk" x86-feature-1 x86-feature-1c
|
|
elfedit_test "--disable-x86-feature ibt" x86-feature-1 x86-feature-1d
|
|
elfedit_test "--enable-x86-feature ibt --enable-x86-feature shstk" \
|
|
x86-feature-1 x86-feature-1e
|
|
|
|
proc check_pr25749a {testname srcfilea srcfileb cflags ldflags lderror} {
|
|
global objcopy
|
|
global srcdir
|
|
global subdir
|
|
|
|
if { [istarget "i?86-*-linux*"] } {
|
|
set output_arch "i386:i386"
|
|
set output_target "elf32-i386"
|
|
} else {
|
|
set output_arch "i386:x86-64"
|
|
if {[istarget "x86_64-*-linux*-gnux32"]} {
|
|
set output_target "elf32-x86-64"
|
|
} else {
|
|
set output_target "elf64-x86-64"
|
|
}
|
|
}
|
|
|
|
# Suppress warning for unsupported attribute from older GCC.
|
|
append cflags " -w"
|
|
|
|
exec cp $srcdir/$subdir/$srcfilea $srcfilea
|
|
exec chmod +w $srcfilea
|
|
set pr25749_bin "$objcopy -B $output_arch -I binary -O $output_target $srcfilea tmpdir/pr25749-bin.o"
|
|
send_log "$pr25749_bin\n"
|
|
set got [remote_exec host "$pr25749_bin"]
|
|
if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
|
|
send_log "$got\n"
|
|
fail "Convert $srcfilea to $output_target"
|
|
return
|
|
}
|
|
|
|
if {"$lderror" == ""} {
|
|
run_cc_link_tests [list \
|
|
[list \
|
|
"Build $testname ($ldflags $cflags)" \
|
|
"$ldflags tmpdir/pr25749-bin.o -z noexecstack" \
|
|
"$cflags -I../bfd" \
|
|
[list $srcfilea $srcfileb]\
|
|
{{readelf {-Wr} pr25749.rd}} \
|
|
"${testname}a" \
|
|
] \
|
|
]
|
|
run_ld_link_exec_tests [list \
|
|
[list \
|
|
"Run ${testname}a ($ldflags $cflags)" \
|
|
"$ldflags tmpdir/pr25749-bin.o -z noexecstack" \
|
|
"" \
|
|
[list $srcfilea $srcfileb]\
|
|
"${testname}a" \
|
|
"pass.out" \
|
|
"$cflags -I../bfd" \
|
|
] \
|
|
]
|
|
} else {
|
|
run_cc_link_tests [list \
|
|
[list \
|
|
"Build $testname ($ldflags $cflags)" \
|
|
"$ldflags tmpdir/pr25749-bin.o -z noexecstack" \
|
|
"$cflags -I../bfd" \
|
|
[list $srcfilea $srcfileb]\
|
|
[list [list error_output $lderror]] \
|
|
"$testname" \
|
|
] \
|
|
]
|
|
}
|
|
}
|
|
|
|
check_pr25749a "pr25749-1a" "pr25749-1.c" "pr25749-1a.c" "$NOPIE_CFLAGS" "$NOPIE_LDFLAGS" ""
|
|
check_pr25749a "pr25749-1a" "pr25749-1.c" "pr25749-1a.c" "-fPIE" "-pie" ""
|
|
check_pr25749a "pr25749-1b" "pr25749-1.c" "pr25749-1b.c" "$NOPIE_CFLAGS" "$NOPIE_LDFLAGS" ""
|
|
if { [istarget "i?86-*-linux*"] || ![at_least_gcc_version 5 1] } {
|
|
check_pr25749a "pr25749-1b" "pr25749-1.c" "pr25749-1b.c" "-fPIE" "-pie" ""
|
|
} else {
|
|
check_pr25749a "pr25749-1b" "pr25749-1.c" "pr25749-1b.c" "-fPIE" "-pie" "pr25749-1b.err"
|
|
}
|
|
check_pr25749a "pr25749-1c" "pr25749-1.c" "pr25749-1c.c" "-fPIC" "-shared" "pr25749-1b.err"
|
|
check_pr25749a "pr25749-2a" "pr25749-2.c" "pr25749-2a.s" "$NOPIE_CFLAGS" "$NOPIE_LDFLAGS" ""
|
|
check_pr25749a "pr25749-2a" "pr25749-2.c" "pr25749-2a.s" "-fPIE" "-pie" ""
|
|
check_pr25749a "pr25749-2b" "pr25749-2.c" "pr25749-2b.s" "$NOPIE_CFLAGS" "$NOPIE_LDFLAGS" ""
|
|
check_pr25749a "pr25749-2b" "pr25749-2.c" "pr25749-2b.s" "-fPIE" "-pie" ""
|
|
check_pr25749a "pr25754-1a" "pr25754-1a.c" "pr25754-1b.s" "$NOPIE_CFLAGS" "$NOPIE_LDFLAGS" ""
|
|
check_pr25749a "pr25754-1b" "pr25754-1a.c" "pr25754-1b.s" "-fPIE" "$NOPIE_LDFLAGS" ""
|
|
check_pr25749a "pr25754-1c" "pr25754-1a.c" "pr25754-1b.s" "-fPIC" "$NOPIE_LDFLAGS" ""
|
|
check_pr25749a "pr25754-1d" "pr25754-1a.c" "pr25754-1b.s" "-fPIC" "-pie" ""
|
|
if { [istarget "i?86-*-linux*"] || [istarget "x86_64-*-linux*-gnux32"]} {
|
|
check_pr25749a "pr25754-2a" "pr25754-2a.c" "pr25754-2b.s" "-fPIC" "$NOPIE_LDFLAGS" ""
|
|
check_pr25749a "pr25754-2b" "pr25754-2a.c" "pr25754-2b.s" "-fPIC" "-pie" ""
|
|
} else {
|
|
check_pr25749a "pr25754-3a" "pr25754-3a.c" "pr25754-3b.s" "-fPIC" "$NOPIE_LDFLAGS" ""
|
|
check_pr25749a "pr25754-3b" "pr25754-3a.c" "pr25754-3b.s" "-fPIC" "-pie" ""
|
|
}
|
|
if { [istarget "i?86-*-linux*"] } {
|
|
check_pr25749a "pr25754-4a" "pr25754-4a.c" "pr25754-4b.s" "$NOPIE_CFLAGS" "$NOPIE_LDFLAGS" ""
|
|
check_pr25749a "pr25754-4b" "pr25754-4a.c" "pr25754-4b.s" "-fpie" "-pie" ""
|
|
check_pr25749a "pr25754-5a" "pr25754-5a.c" "pr25754-5b.s" "$NOPIE_CFLAGS" "$NOPIE_LDFLAGS" ""
|
|
check_pr25749a "pr25754-5b" "pr25754-5a.c" "pr25754-5b.s" "-fpie" "-pie" ""
|
|
} else {
|
|
check_pr25749a "pr25754-4a" "pr25754-4a.c" "pr25754-4c.s" "$NOPIE_CFLAGS" "$NOPIE_LDFLAGS" ""
|
|
check_pr25749a "pr25754-4b" "pr25754-4a.c" "pr25754-4c.s" "-fpie" "-pie" ""
|
|
check_pr25749a "pr25754-5a" "pr25754-5a.c" "pr25754-5c.s" "$NOPIE_CFLAGS" "$NOPIE_LDFLAGS" ""
|
|
check_pr25749a "pr25754-5b" "pr25754-5a.c" "pr25754-5c.s" "-fpie" "-pie" ""
|
|
if { ![istarget "x86_64-*-linux*-gnux32"]} {
|
|
check_pr25749a "pr25754-6a" "pr25754-6a.c" "pr25754-6b.s" "$NOPIE_CFLAGS" "$NOPIE_LDFLAGS" ""
|
|
check_pr25749a "pr25754-6b" "pr25754-6a.c" "pr25754-6b.s" "-fpie" "-pie" ""
|
|
}
|
|
}
|
|
|
|
proc check_pr25749b {testname srcfilea srcfileb cflags ldflags dsoldflags args} {
|
|
global objcopy
|
|
global srcdir
|
|
global subdir
|
|
|
|
if { [istarget "i?86-*-linux*"] } {
|
|
set output_arch "i386:i386"
|
|
set output_target "elf32-i386"
|
|
} else {
|
|
set output_arch "i386:x86-64"
|
|
if {[istarget "x86_64-*-linux*-gnux32"]} {
|
|
set output_target "elf32-x86-64"
|
|
} else {
|
|
set output_target "elf64-x86-64"
|
|
}
|
|
}
|
|
|
|
exec cp $srcdir/$subdir/$srcfilea $srcfilea
|
|
exec chmod +w $srcfilea
|
|
set pr25749_bin "$objcopy -B $output_arch -I binary -O $output_target $srcfilea tmpdir/pr25749-bin.o"
|
|
send_log "$pr25749_bin\n"
|
|
set got [remote_exec host "$pr25749_bin"]
|
|
if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
|
|
send_log "$got\n"
|
|
fail "Convert $srcfilea to $output_target"
|
|
return
|
|
}
|
|
|
|
run_cc_link_tests [list \
|
|
[list \
|
|
"Build lib${testname}.so ($dsoldflags)" \
|
|
"-shared $dsoldflags tmpdir/pr25749-bin.o -z noexecstack" \
|
|
"-fPIC -I../bfd" \
|
|
[list $srcfileb] \
|
|
{{readelf {-Wr} pr25749.rd}} \
|
|
"lib${testname}.so" \
|
|
] \
|
|
]
|
|
|
|
set pass "pass.out"
|
|
if { [llength $args] > 0 } {
|
|
set pass [lindex $args 0]
|
|
}
|
|
|
|
run_ld_link_exec_tests [list \
|
|
[list \
|
|
"Run ${testname}b ($ldflags $cflags)" \
|
|
"$ldflags -Wl,--no-as-needed tmpdir/lib${testname}.so -z noexecstack" \
|
|
"" \
|
|
[list $srcfilea]\
|
|
"${testname}b" \
|
|
"$pass" \
|
|
"$cflags -I../bfd" \
|
|
] \
|
|
]
|
|
}
|
|
|
|
check_pr25749b "pr25749-1a" "pr25749-1.c" "pr25749-1a.c" "$NOPIE_CFLAGS" "$NOPIE_LDFLAGS" ""
|
|
check_pr25749b "pr25749-1a" "pr25749-1.c" "pr25749-1a.c" "-fPIE" "-pie" ""
|
|
check_pr25749b "pr25749-1a" "pr25749-1.c" "pr25749-1a.c" "-fPIE" "-pie" "-Wl,-Bsymbolic"
|
|
check_pr25749b "pr25749-1b" "pr25749-1.c" "pr25749-1b.c" "$NOPIE_CFLAGS" "$NOPIE_LDFLAGS" "" "passall.out"
|
|
check_pr25749b "pr25749-1b" "pr25749-1.c" "pr25749-1b.c" "-fPIE" "-pie" "" "passall.out"
|
|
check_pr25749b "pr25749-1b" "pr25749-1.c" "pr25749-1b.c" "-fPIE" "-pie" "-Wl,-Bsymbolic"
|
|
check_pr25749b "pr25749-1d" "pr25749-1.c" "pr25749-1d.c" "$NOPIE_CFLAGS" "$NOPIE_LDFLAGS" "-Wl,-defsym=_begin=0"
|
|
check_pr25749b "pr25749-1d" "pr25749-1.c" "pr25749-1d.c" "-fPIE" "-pie" "-Wl,-defsym=_begin=0"
|
|
check_pr25749b "pr25749-1d" "pr25749-1.c" "pr25749-1d.c" "-fPIE" "-pie" "-Wl,-Bsymbolic -Wl,-defsym=_begin=0"
|
|
check_pr25749b "pr25749-2a" "pr25749-2.c" "pr25749-2a.s" "$NOPIE_CFLAGS" "$NOPIE_LDFLAGS" "" "passall.out"
|
|
check_pr25749b "pr25749-2a" "pr25749-2.c" "pr25749-2a.s" "-fPIE" "-pie" "" "passall.out"
|
|
check_pr25749b "pr25749-2b" "pr25749-2.c" "pr25749-2b.s" "$NOPIE_CFLAGS" "$NOPIE_LDFLAGS" ""
|
|
check_pr25749b "pr25749-2b" "pr25749-2.c" "pr25749-2b.s" "-fPIE" "-pie" ""
|