]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - ld/testsuite/ld-elf/linux-x86.exp
Update year range in copyright notice of binutils files
[thirdparty/binutils-gdb.git] / ld / testsuite / ld-elf / linux-x86.exp
index b1cad615eb59b2625ab5c48ec705209a8d86defc..a16da10505bdc884471debdea8c6208b73d25d05 100644 (file)
@@ -1,5 +1,5 @@
 # Expect script for simple native Linux/x86 tests.
-#   Copyright (C) 2018-2019 Free Software Foundation, Inc.
+#   Copyright (C) 2018-2021 Free Software Foundation, Inc.
 #
 # This file is part of the GNU Binutils.
 #
 # MA 02110-1301, USA.
 #
 
-# Test very simple native Linux/x86 programs with linux-x86.S.
-if { ![isnative] || [which $CC] == 0 \
-     || (![istarget "i?86-*-linux*"] \
-         && ![istarget "x86_64-*-linux*"] \
-         && ![istarget "amd64-*-linux*"]) } {
+# Linux/x86 tests.
+if { ![istarget "i?86-*-linux*"] \
+       && ![istarget "x86_64-*-linux*"] \
+       && ![istarget "amd64-*-linux*"] } {
     return
 }
 
-# Add $PLT_CFLAGS if PLT is expected.
-global PLT_CFLAGS
-# Add $NOPIE_CFLAGS and $NOPIE_LDFLAGS if non-PIE is required.
-global NOPIE_CFLAGS NOPIE_LDFLAGS
+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" \
@@ -40,7 +56,7 @@ run_ld_link_exec_tests [list \
        { linux-x86.S pr23428.c dummy.s } \
        "pr23428" \
        "pass.out" \
-       "$NOPIE_CFLAGS -fno-asynchronous-unwind-tables" \
+       "$NOPIE_CFLAGS $NOSANITIZE_CFLAGS -fno-asynchronous-unwind-tables" \
        "asm" \
     ] \
 ]
@@ -90,3 +106,181 @@ 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" ""