# Create separate binaries for each testcase - to make the possible reported
# problem reproducible after the whole test run finishes.
-foreach ldprelink {NO YES} {
- foreach ldsepdebug {NO IN SEP} {
+foreach_with_prefix ldprelink {NO YES} {
+ foreach_with_prefix ldsepdebug {NO IN SEP} {
# Skip running the ldsepdebug test if we do not have system separate
# debug info available.
if {$interp_system_debug == "" && $ldsepdebug == "SEP"} {
# possibly unprelinked ld.so to test all the combinations for GDB.
set interp_saved ${interp}-saved
- with_test_prefix "$ldname" {
- if {$ldsepdebug == "NO"} {
- file_copy $interp_system $interp
- # Never call strip-debug before unprelink:
- # prelink: ...: Section .note.gnu.build-id created after prelinking
- if ![prelinkNO $interp] {
- continue
- }
- strip_debug $interp
- } elseif {$ldsepdebug == "IN" && $interp_system_debug == ""} {
- file_copy $interp_system $interp
- } elseif {$ldsepdebug == "IN" && $interp_system_debug != ""} {
- file_copy $interp_system $interp
- file_copy $interp_system_debug "${interp}.debug"
- # eu-unstrip: DWARF data in '...' not adjusted for prelinking bias; consider prelink -u
- if {![prelinkNO $interp] || ![prelinkNO "${interp}.debug"]} {
- continue
- }
- set test "eu-unstrip unprelinked:[file tail $interp_system] + [file tail $interp_system_debug] to [file tail $interp]"
- set command "exec eu-unstrip -o $interp $interp ${interp}.debug"
- verbose -log "command is $command"
- if [catch $command] {
- setup_xfail *-*-*
- fail $test
- continue
- } else {
- pass $test
- }
- } elseif {$ldsepdebug == "SEP" && $interp_system_debug == ""} {
- file_copy $interp_system $interp
- # eu-unstrip: DWARF data in '...' not adjusted for prelinking bias; consider prelink -u
- if ![prelinkNO $interp] {
- continue
- }
- gdb_gnu_strip_debug $interp
- } elseif {$ldsepdebug == "SEP" && $interp_system_debug != ""} {
- file_copy $interp_system $interp
- file_copy $interp_system_debug "${interp}.debug"
- }
-
- if {$ldsepdebug == "SEP"} {
- if ![prelinkNO "${interp}.debug"] {
- continue
- }
- } else {
- file delete "${interp}.debug"
+ if {$ldsepdebug == "NO"} {
+ file_copy $interp_system $interp
+ # Never call strip-debug before unprelink:
+ # prelink: ...: Section .note.gnu.build-id created after prelinking
+ if ![prelinkNO $interp] {
+ continue
}
-
- if ![prelink$ldprelink $interp "$interp, second time"] {
+ strip_debug $interp
+ } elseif {$ldsepdebug == "IN" && $interp_system_debug == ""} {
+ file_copy $interp_system $interp
+ } elseif {$ldsepdebug == "IN" && $interp_system_debug != ""} {
+ file_copy $interp_system $interp
+ file_copy $interp_system_debug "${interp}.debug"
+ # eu-unstrip: DWARF data in '...' not adjusted for prelinking bias; consider prelink -u
+ if {![prelinkNO $interp] || ![prelinkNO "${interp}.debug"]} {
continue
}
-
- if {$ldprelink == "NO"} {
- set displacement "NONZERO"
+ set test "eu-unstrip unprelinked:[file tail $interp_system] + [file tail $interp_system_debug] to [file tail $interp]"
+ set command "exec eu-unstrip -o $interp $interp ${interp}.debug"
+ verbose -log "command is $command"
+ if [catch $command] {
+ setup_xfail *-*-*
+ fail $test
+ continue
} else {
- # x86* kernel loads prelinked PIE binary at its
- # prelinked address but ppc* kernel loads it at a
- # random address. prelink normally skips PIE binaries
- # during the system scan.
- set displacement "PRESENT"
+ pass $test
}
- test_ld $interp 0 [expr {$ldsepdebug == "NO"}] $displacement
+ } elseif {$ldsepdebug == "SEP" && $interp_system_debug == ""} {
+ file_copy $interp_system $interp
+ # eu-unstrip: DWARF data in '...' not adjusted for prelinking bias; consider prelink -u
+ if ![prelinkNO $interp] {
+ continue
+ }
+ gdb_gnu_strip_debug $interp
+ } elseif {$ldsepdebug == "SEP" && $interp_system_debug != ""} {
+ file_copy $interp_system $interp
+ file_copy $interp_system_debug "${interp}.debug"
+ }
- if ![file_copy $interp $interp_saved] {
+ if {$ldsepdebug == "SEP"} {
+ if ![prelinkNO "${interp}.debug"] {
continue
}
+ } else {
+ file delete "${interp}.debug"
+ }
- foreach binprelink {NO YES} {
- foreach binsepdebug {NO IN SEP} {
- # "ATTACH" is like "YES" but it is modified during
- # run. It cannot be used for problem
- # reproducibility after the testcase ends.
- foreach binpie {NO YES ATTACH} {
- # This combination is not possible, non-PIE (fixed address)
- # binary cannot be prelinked to any (other) address.
- if {$binprelink == "YES" && $binpie == "NO"} {
- continue
- }
+ if ![prelink$ldprelink $interp "$interp, second time"] {
+ continue
+ }
- set binname "BINprelink${binprelink}debug${binsepdebug}pie${binpie}"
- set exec $binprefix-$binname
+ if {$ldprelink == "NO"} {
+ set displacement "NONZERO"
+ } else {
+ # x86* kernel loads prelinked PIE binary at its
+ # prelinked address but ppc* kernel loads it at a
+ # random address. prelink normally skips PIE binaries
+ # during the system scan.
+ set displacement "PRESENT"
+ }
+ test_ld $interp 0 [expr {$ldsepdebug == "NO"}] $displacement
- with_test_prefix "$binname" {
- set opts "ldflags=-Wl,$binfile_lib,-rpath,[file dirname $binfile_lib]"
- if {$binsepdebug != "NO"} {
- lappend opts {debug}
- }
- if {$binpie != "NO"} {
- lappend opts {pie}
- } else {
- # Debian9/Ubuntu16.10 onwards default to PIE enabled. Ensure it is disabled.
- lappend opts {nopie}
- }
+ if ![file_copy $interp $interp_saved] {
+ continue
+ }
- set dir ${exec}.d
- set relink_args [build_executable_own_libs ${test}.exp [file tail $exec] $srcfile $opts $interp $dir]
- if {$relink_args == ""} {
- continue
- }
+ foreach_with_prefix binprelink {NO YES} {
+ foreach_with_prefix binsepdebug {NO IN SEP} {
+ # "ATTACH" is like "YES" but it is modified during
+ # run. It cannot be used for problem
+ # reproducibility after the testcase ends.
+ foreach_with_prefix binpie {NO YES ATTACH} {
+ # This combination is not possible, non-PIE (fixed address)
+ # binary cannot be prelinked to any (other) address.
+ if {$binprelink == "YES" && $binpie == "NO"} {
+ continue
+ }
- if {$binsepdebug == "SEP"} {
- gdb_gnu_strip_debug $exec
- }
+ set binname "BINprelink${binprelink}debug${binsepdebug}pie${binpie}"
+ set exec $binprefix-$binname
- if {$binpie == "NO"} {
- set displacement "NONE"
- } elseif {$binprelink == "NO"} {
- set displacement "NONZERO"
+ set opts "ldflags=-Wl,$binfile_lib,-rpath,[file dirname $binfile_lib]"
+ if {$binsepdebug != "NO"} {
+ lappend opts {debug}
+ }
+ if {$binpie != "NO"} {
+ lappend opts {pie}
+ } else {
+ # Debian9/Ubuntu16.10 onwards default to PIE enabled. Ensure it is disabled.
+ lappend opts {nopie}
+ }
+
+ set dir ${exec}.d
+ set relink_args [build_executable_own_libs ${test}.exp [file tail $exec] $srcfile $opts $interp $dir]
+ if {$relink_args == ""} {
+ continue
+ }
+
+ if {$binsepdebug == "SEP"} {
+ gdb_gnu_strip_debug $exec
+ }
+
+ if {$binpie == "NO"} {
+ set displacement "NONE"
+ } elseif {$binprelink == "NO"} {
+ set displacement "NONZERO"
+ } else {
+ # x86* kernel loads prelinked PIE binary at its prelinked
+ # address but ppc* kernel loads it at a random address.
+ # prelink normally skips PIE binaries during the system scan.
+ set displacement "PRESENT"
+ }
+
+ if {[prelink$binprelink $relink_args [file tail $exec]]
+ && [file_copy $interp_saved $interp]} {
+ # In order to make test names unique wrap the core of this if block
+ # with a test prefix. Some of the tests performed in the if
+ # condition are repeated within this body.
+ with_test_prefix "INNER" {
+ if {$binpie != "ATTACH"} {
+ test_ld $exec 1 [expr {$binsepdebug == "NO"}] $displacement
} else {
- # x86* kernel loads prelinked PIE binary at its prelinked
- # address but ppc* kernel loads it at a random address.
- # prelink normally skips PIE binaries during the system scan.
- set displacement "PRESENT"
- }
+ # If the file has been randomly prelinked it must be
+ # "NONZERO". We could see "ZERO" only if it was unprelinked
+ # and it is now running at the same address - which is 0 but
+ # executable can never run at address 0.
- if {[prelink$binprelink $relink_args [file tail $exec]]
- && [file_copy $interp_saved $interp]} {
- # In order to make test names unique wrap the core of this if block
- # with a test prefix. Some of the tests performed in the if
- # condition are repeated within this body.
- with_test_prefix "INNER" {
- if {$binpie != "ATTACH"} {
- test_ld $exec 1 [expr {$binsepdebug == "NO"}] $displacement
- } else {
- # If the file has been randomly prelinked it must be
- # "NONZERO". We could see "ZERO" only if it was unprelinked
- # and it is now running at the same address - which is 0 but
- # executable can never run at address 0.
-
- set displacement "NONZERO"
- test_attach $exec $displacement $relink_args
-
- # ATTACH means that executables and libraries have been
- # modified after they have been run. They cannot be reused
- # for problem reproducibility after the testcase ends in
- # the ATTACH case. Therefore they are rather deleted not
- # to confuse after the run finishes.
- set exec_debug [system_debug_get $exec]
- if {$exec_debug != ""} {
- # `file delete [glob "${exec_debug}*"]' does not work.
- foreach f [glob "${exec_debug}*"] {
- file delete $f
- }
- }
- file delete -force $dir
- # `file delete [glob "${exec}*"]' does not work.
- foreach f [glob "${exec}*"] {
- file delete $f
- }
+ set displacement "NONZERO"
+ test_attach $exec $displacement $relink_args
+
+ # ATTACH means that executables and libraries have been
+ # modified after they have been run. They cannot be reused
+ # for problem reproducibility after the testcase ends in
+ # the ATTACH case. Therefore they are rather deleted not
+ # to confuse after the run finishes.
+ set exec_debug [system_debug_get $exec]
+ if {$exec_debug != ""} {
+ # `file delete [glob "${exec_debug}*"]' does not work.
+ foreach f [glob "${exec_debug}*"] {
+ file delete $f
}
}
+ file delete -force $dir
+ # `file delete [glob "${exec}*"]' does not work.
+ foreach f [glob "${exec}*"] {
+ file delete $f
+ }
}
}
}
}
}
-
- file delete $interp_saved
}
+
+ file delete $interp_saved
}
}