| # Expect script for simple native Linux/x86 tests. |
| # Copyright (C) 2018-2021 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" \ |
| "" \ |
| { 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" \ |
| "-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 \ |
| 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 \ |
| 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 \ |
| 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" \ |
| ] \ |
| ] |
| |
| run_ld_link_exec_tests [list \ |
| [list \ |
| "Run indirect-extern-access-1a without PIE" \ |
| "$NOPIE_LDFLAGS" \ |
| "" \ |
| { 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" \ |
| "" \ |
| { 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" \ |
| "" \ |
| { 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" \ |
| "" \ |
| { indirect-extern-access.S indirect-extern-access-2b.c } \ |
| "indirect-extern-access-2b" \ |
| "pass.out" \ |
| "-fpie" \ |
| "" \ |
| "" \ |
| "tmpdir/indirect-extern-access-2.so" \ |
| ] \ |
| ] |
| |
| 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" \ |
| "$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" \ |
| "" \ |
| [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" \ |
| "$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" \ |
| "-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" \ |
| "" \ |
| [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" "" |