elf: Set p_align to the minimum page size if possible
[binutils-gdb.git] / ld / testsuite / ld-elf / linux-x86.exp
index 7186dede711e9da4d7cdc1e60101873a35e35244..2e0cbd37f1764ebc0e7d2ae308150b1d051972f3 100644 (file)
@@ -1,5 +1,5 @@
 # Expect script for simple native Linux/x86 tests.
-#   Copyright (C) 2018-2020 Free Software Foundation, Inc.
+#   Copyright (C) 2018-2022 Free Software Foundation, Inc.
 #
 # This file is part of the GNU Binutils.
 #
@@ -48,15 +48,6 @@ run_ld_link_tests [list \
 ]
 
 # Test very simple native Linux/x86 programs with linux-x86.S.
-if { ![isnative] || ![check_compiler_available] } {
-    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_exec_tests [list \
     [list \
        "Run PR ld/23428 test" \
@@ -65,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" \
     ] \
 ]
@@ -82,6 +73,156 @@ run_ld_link_tests [list \
     ] \
 ]
 
+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" \
+    ] \
+    [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" \
+    ] \
+]
+
 proc elfedit_test { options test output } {
     global ELFEDIT
     global READELF
@@ -93,13 +234,13 @@ proc elfedit_test { options test output } {
     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"
-       unresolved "$test_name"
+       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"
-       unresolved "$test_name"
+       fail "$test_name"
 }
     if { [regexp_diff tmpdir/$output.out $srcdir/$subdir/$output.rd] } then {
        fail "$test_name"
@@ -133,7 +274,11 @@ proc check_pr25749a {testname srcfilea srcfileb cflags ldflags lderror} {
        }
     }
 
+    # 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"]
@@ -148,7 +293,7 @@ proc check_pr25749a {testname srcfilea srcfileb cflags ldflags lderror} {
            [list \
                "Build $testname ($ldflags $cflags)" \
                "$ldflags tmpdir/pr25749-bin.o" \
-               "$cflags" \
+               "$cflags -I../bfd" \
                [list $srcfilea $srcfileb]\
                {{readelf {-Wr} pr25749.rd}}  \
                "${testname}a" \
@@ -162,7 +307,7 @@ proc check_pr25749a {testname srcfilea srcfileb cflags ldflags lderror} {
                [list $srcfilea $srcfileb]\
                "${testname}a" \
                "pass.out" \
-               "$cflags" \
+               "$cflags -I../bfd" \
            ] \
        ]
     } else {
@@ -170,7 +315,7 @@ proc check_pr25749a {testname srcfilea srcfileb cflags ldflags lderror} {
            [list \
                "Build $testname ($ldflags $cflags)" \
                "$ldflags tmpdir/pr25749-bin.o" \
-               "$cflags" \
+               "$cflags -I../bfd" \
                [list $srcfilea $srcfileb]\
                [list [list error_output $lderror]] \
                "$testname" \
@@ -182,7 +327,7 @@ proc check_pr25749a {testname srcfilea srcfileb cflags ldflags lderror} {
 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*"] } {
+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"
@@ -219,7 +364,7 @@ if { [istarget "i?86-*-linux*"] } {
     }
 }
 
-proc check_pr25749b {testname srcfilea srcfileb cflags ldflags dsoldflags} {
+proc check_pr25749b {testname srcfilea srcfileb cflags ldflags dsoldflags args} {
     global objcopy
     global srcdir
     global subdir
@@ -237,6 +382,7 @@ proc check_pr25749b {testname srcfilea srcfileb cflags ldflags dsoldflags} {
     }
 
     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"]
@@ -250,12 +396,18 @@ proc check_pr25749b {testname srcfilea srcfileb cflags ldflags dsoldflags} {
        [list \
            "Build lib${testname}.so ($dsoldflags)" \
            "-shared $dsoldflags tmpdir/pr25749-bin.o" \
-           "-fPIC" \
+           "-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)" \
@@ -263,8 +415,8 @@ proc check_pr25749b {testname srcfilea srcfileb cflags ldflags dsoldflags} {
            "" \
            [list $srcfilea]\
            "${testname}b" \
-           "pass.out" \
-           "$cflags" \
+           "$pass" \
+           "$cflags -I../bfd" \
        ] \
     ]
 }
@@ -272,13 +424,13 @@ proc check_pr25749b {testname srcfilea srcfileb cflags ldflags dsoldflags} {
 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" ""
-check_pr25749b "pr25749-1b" "pr25749-1.c" "pr25749-1b.c" "-fPIE" "-pie" ""
+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" ""
-check_pr25749b "pr25749-2a" "pr25749-2.c" "pr25749-2a.s" "-fPIE" "-pie" ""
+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" ""