| OLD | NEW |
| 1 # Copyright 2010-2012 Free Software Foundation, Inc. | 1 # Copyright 2010-2012 Free Software Foundation, Inc. |
| 2 | 2 |
| 3 # This program is free software; you can redistribute it and/or modify | 3 # This program is free software; you can redistribute it and/or modify |
| 4 # it under the terms of the GNU General Public License as published by | 4 # it under the terms of the GNU General Public License as published by |
| 5 # the Free Software Foundation; either version 3 of the License, or | 5 # the Free Software Foundation; either version 3 of the License, or |
| 6 # (at your option) any later version. | 6 # (at your option) any later version. |
| 7 # | 7 # |
| 8 # This program is distributed in the hope that it will be useful, | 8 # This program is distributed in the hope that it will be useful, |
| 9 # but WITHOUT ANY WARRANTY; without even the implied warranty of | 9 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 | 23 |
| 24 set test "break-interp" | 24 set test "break-interp" |
| 25 set binprefix ${objdir}/${subdir}/${test} | 25 set binprefix ${objdir}/${subdir}/${test} |
| 26 # Only to get the $interp_system name. | 26 # Only to get the $interp_system name. |
| 27 set srcfile_test "start.c" | 27 set srcfile_test "start.c" |
| 28 set binfile_test ${test}-test | 28 set binfile_test ${test}-test |
| 29 set binfile_lib ${objdir}/${subdir}/${test}.so | 29 set binfile_lib ${objdir}/${subdir}/${test}.so |
| 30 set srcfile "${test}-main.c" | 30 set srcfile "${test}-main.c" |
| 31 set srcfile_lib "${test}-lib.c" | 31 set srcfile_lib "${test}-lib.c" |
| 32 | 32 |
| 33 if [get_compiler_info ${binfile_lib}] { | 33 if [get_compiler_info] { |
| 34 return -1 | 34 return -1 |
| 35 } | 35 } |
| 36 | 36 |
| 37 # Use -soname so that the new library gets copied by build_executable_own_libs. | 37 # Use -soname so that the new library gets copied by build_executable_own_libs. |
| 38 | 38 |
| 39 if {[gdb_compile_shlib ${srcdir}/${subdir}/${srcfile_lib} ${binfile_lib} [list d
ebug ldflags=-Wl,-soname,${test}.so]] != ""} { | 39 if {[gdb_compile_shlib ${srcdir}/${subdir}/${srcfile_lib} ${binfile_lib} [list d
ebug ldflags=-Wl,-soname,${test}.so]] != ""} { |
| 40 return -1 | 40 return -1 |
| 41 } | 41 } |
| 42 | 42 |
| 43 if {[build_executable ${test}.exp $binfile_test ${srcfile_test} {}] == -1} { | 43 if {[build_executable ${test}.exp $binfile_test ${srcfile_test} {}] == -1} { |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 148 pass $test | 148 pass $test |
| 149 } | 149 } |
| 150 } | 150 } |
| 151 -re "Breakpoint \[0-9\]+, \[0-9xa-f\]+ in \\.?(__GI_)?$func \\(\\).*\r\n
$gdb_prompt $" { | 151 -re "Breakpoint \[0-9\]+, \[0-9xa-f\]+ in \\.?(__GI_)?$func \\(\\).*\r\n
$gdb_prompt $" { |
| 152 if {$func == "_dl_debug_state"} { | 152 if {$func == "_dl_debug_state"} { |
| 153 fail $test | 153 fail $test |
| 154 } else { | 154 } else { |
| 155 pass $test | 155 pass $test |
| 156 } | 156 } |
| 157 } | 157 } |
| 158 » -re "Stopped due to shared library event\r\n$gdb_prompt $" { | 158 » -re "Stopped due to (spurious )?shared library event.*\r\n$gdb_prompt $"
{ |
| 159 if {$func == "_dl_debug_state"} { | 159 if {$func == "_dl_debug_state"} { |
| 160 if {$debug_state_count == 0} { | 160 if {$debug_state_count == 0} { |
| 161 # First stop does not yet relocate the _start function | 161 # First stop does not yet relocate the _start function |
| 162 # descriptor on ppc64. | 162 # descriptor on ppc64. |
| 163 set debug_state_count 1 | 163 set debug_state_count 1 |
| 164 send_gdb "continue\n" | 164 send_gdb "continue\n" |
| 165 exp_continue | 165 exp_continue |
| 166 } else { | 166 } else { |
| 167 pass $test | 167 pass $test |
| 168 } | 168 } |
| 169 } else { | 169 } else { |
| 170 fail $test | 170 fail $test |
| 171 } | 171 } |
| 172 } | 172 } |
| 173 } | 173 } |
| 174 if ![regexp {^(NONE|FOUND-.*)$} $displacement] { | 174 if ![regexp {^(NONE|FOUND-.*)$} $displacement] { |
| 175 fail $test_displacement | 175 fail $test_displacement |
| 176 } | 176 } |
| 177 | 177 |
| 178 if {$func == "_dl_debug_state"} { | 178 if {$func == "_dl_debug_state"} { |
| 179 gdb_test_no_output "set stop-on-solib-events 0" | 179 gdb_test_no_output "set stop-on-solib-events 0" |
| 180 } | 180 } |
| 181 } | 181 } |
| 182 | 182 |
| 183 # `runto' does not check we stopped really at the function we specified. | 183 # `runto' does not check we stopped really at the function we specified. |
| 184 # DISPLACEMENT can be "NONE" for no message to be present, "ZERO" for | 184 # DISPLACEMENT can be "NONE" for no message to be present, "ZERO" for |
| 185 # displacement of 0 bytes to be present, "NONZERO" for displacement of non-0 | 185 # displacement of 0 bytes to be present, "NONZERO" for displacement of non-0 |
| 186 # bytes to be present and "PRESENT" if both "ZERO" and "NONZERO" are valid. | 186 # bytes to be present and "PRESENT" if both "ZERO" and "NONZERO" are valid. |
| 187 proc reach {func command displacement} { | 187 proc reach {func command displacement} { |
| 188 global pf_prefix | 188 with_test_prefix "reach-$func" { |
| 189 set old_ldprefix $pf_prefix | 189 » reach_1 $func $command $displacement |
| 190 lappend pf_prefix "reach-$func:" | 190 } |
| 191 | |
| 192 reach_1 $func $command $displacement | |
| 193 | |
| 194 set pf_prefix $old_ldprefix | |
| 195 } | 191 } |
| 196 | 192 |
| 197 proc test_core {file displacement} { | 193 proc test_core {file displacement} { with_test_prefix "core" { |
| 198 global srcdir subdir gdb_prompt expect_out | 194 global srcdir subdir gdb_prompt expect_out |
| 199 | 195 |
| 200 set corefile [core_find $file {} "segv"] | 196 set corefile [core_find $file {} "segv"] |
| 201 if {$corefile == ""} { | 197 if {$corefile == ""} { |
| 202 return | 198 return |
| 203 } | 199 } |
| 204 | 200 |
| 205 global pf_prefix | |
| 206 set old_ldprefix $pf_prefix | |
| 207 lappend pf_prefix "core:" | |
| 208 | |
| 209 gdb_exit | 201 gdb_exit |
| 210 gdb_start | 202 gdb_start |
| 211 # Clear it to never find any separate debug infos in $debug_root. | 203 # Clear it to never find any separate debug infos in $debug_root. |
| 212 gdb_test_no_output "set debug-file-directory" \ | 204 gdb_test_no_output "set debug-file-directory" \ |
| 213 "set debug-file-directory for core" | 205 "set debug-file-directory for core" |
| 214 gdb_reinitialize_dir $srcdir/$subdir | 206 gdb_reinitialize_dir $srcdir/$subdir |
| 215 gdb_load $file | 207 gdb_load $file |
| 216 | 208 |
| 217 # Print the "PIE (Position Independent Executable) displacement" message. | 209 # Print the "PIE (Position Independent Executable) displacement" message. |
| 218 gdb_test_no_output "set verbose on" | 210 gdb_test_no_output "set verbose on" |
| (...skipping 19 matching lines...) Expand all Loading... |
| 238 -re "Core was generated by .*\r\n#0 .*$gdb_prompt $" { | 230 -re "Core was generated by .*\r\n#0 .*$gdb_prompt $" { |
| 239 # Do not check the binary filename as it may be truncated. | 231 # Do not check the binary filename as it may be truncated. |
| 240 pass $test | 232 pass $test |
| 241 } | 233 } |
| 242 } | 234 } |
| 243 if ![regexp {^(NONE|FOUND-.*)$} $displacement] { | 235 if ![regexp {^(NONE|FOUND-.*)$} $displacement] { |
| 244 fail $test_displacement | 236 fail $test_displacement |
| 245 } | 237 } |
| 246 | 238 |
| 247 gdb_test "bt" "#\[0-9\]+ +\[^\r\n\]*\\mlibfunc\\M\[^\r\n\]*\r\n#\[0-9\]+ +\[
^\r\n\]*\\mmain\\M.*" "core main bt" | 239 gdb_test "bt" "#\[0-9\]+ +\[^\r\n\]*\\mlibfunc\\M\[^\r\n\]*\r\n#\[0-9\]+ +\[
^\r\n\]*\\mmain\\M.*" "core main bt" |
| 240 }} |
| 248 | 241 |
| 249 set pf_prefix $old_ldprefix | 242 proc test_attach_gdb {file pid displacement prefix} { with_test_prefix "$prefix"
{ |
| 250 } | |
| 251 | |
| 252 proc test_attach_gdb {file pid displacement prefix} { | |
| 253 global gdb_prompt expect_out | 243 global gdb_prompt expect_out |
| 254 | 244 |
| 255 global pf_prefix | |
| 256 set old_ldprefix $pf_prefix | |
| 257 lappend pf_prefix "$prefix:" | |
| 258 | |
| 259 gdb_exit | 245 gdb_exit |
| 260 gdb_start | 246 gdb_start |
| 261 | 247 |
| 262 # Print the "PIE (Position Independent Executable) displacement" message. | 248 # Print the "PIE (Position Independent Executable) displacement" message. |
| 263 gdb_test_no_output "set verbose on" | 249 gdb_test_no_output "set verbose on" |
| 264 | 250 |
| 265 if {$file != ""} { | 251 gdb_test "file $file" "Reading symbols from .*done\\." "file" |
| 266 » gdb_test "file $file" "Reading symbols from .*done\\." "file" | |
| 267 } | |
| 268 | 252 |
| 269 set test "attach" | 253 set test "attach" |
| 270 gdb_test_multiple "attach $pid" $test { | 254 gdb_test_multiple "attach $pid" $test { |
| 271 -re "Attaching to (program: .*, )?process $pid\r\n" { | 255 -re "Attaching to (program: .*, )?process $pid\r\n" { |
| 272 # Missing "$gdb_prompt $" is intentional. | 256 # Missing "$gdb_prompt $" is intentional. |
| 273 pass $test | 257 pass $test |
| 274 } | 258 } |
| 275 } | 259 } |
| 276 | 260 |
| 277 set test "attach final prompt" | 261 set test "attach final prompt" |
| (...skipping 17 matching lines...) Expand all Loading... |
| 295 -re "$gdb_prompt $" { | 279 -re "$gdb_prompt $" { |
| 296 pass $test | 280 pass $test |
| 297 } | 281 } |
| 298 } | 282 } |
| 299 if ![regexp {^(NONE|FOUND-.*)$} $displacement] { | 283 if ![regexp {^(NONE|FOUND-.*)$} $displacement] { |
| 300 fail $test_displacement | 284 fail $test_displacement |
| 301 } | 285 } |
| 302 | 286 |
| 303 gdb_test "bt" "#\[0-9\]+ +\[^\r\n\]*\\mlibfunc\\M\[^\r\n\]*\r\n#\[0-9\]+ +\[
^\r\n\]*\\mmain\\M.*" "attach main bt" | 287 gdb_test "bt" "#\[0-9\]+ +\[^\r\n\]*\\mlibfunc\\M\[^\r\n\]*\r\n#\[0-9\]+ +\[
^\r\n\]*\\mmain\\M.*" "attach main bt" |
| 304 gdb_exit | 288 gdb_exit |
| 305 | 289 }} |
| 306 set pf_prefix $old_ldprefix | |
| 307 } | |
| 308 | 290 |
| 309 proc test_attach {file displacement {relink_args ""}} { | 291 proc test_attach {file displacement {relink_args ""}} { |
| 310 global board_info | 292 global board_info |
| 293 global exec |
| 311 | 294 |
| 312 gdb_exit | 295 gdb_exit |
| 313 | 296 |
| 314 set test "sleep function started" | 297 set test "sleep function started" |
| 315 | 298 |
| 316 set command "${file} sleep" | 299 set command "${file} sleep" |
| 317 set res [remote_spawn host $command]; | 300 set res [remote_spawn host $command]; |
| 318 if { $res < 0 || $res == "" } { | 301 if { $res < 0 || $res == "" } { |
| 319 perror "Spawning $command failed." | 302 perror "Spawning $command failed." |
| 320 fail $test | 303 fail $test |
| 321 return | 304 return |
| 322 } | 305 } |
| 323 set pid [exp_pid -i $res] | 306 set pid [exp_pid -i $res] |
| 324 gdb_expect { | 307 gdb_expect { |
| 325 -re "sleeping\r\n" { | 308 -re "sleeping\r\n" { |
| 326 pass $test | 309 pass $test |
| 327 } | 310 } |
| 328 eof { | 311 eof { |
| 329 fail "$test (eof)" | 312 fail "$test (eof)" |
| 330 return | 313 return |
| 331 } | 314 } |
| 332 timeout { | 315 timeout { |
| 333 fail "$test (timeout)" | 316 fail "$test (timeout)" |
| 334 return | 317 return |
| 335 } | 318 } |
| 336 } | 319 } |
| 337 | 320 |
| 338 if {$relink_args == ""} { | 321 if {$relink_args == ""} { |
| 339 » test_attach_gdb "" $pid $displacement "attach" | 322 » test_attach_gdb $exec $pid $displacement "attach" |
| 340 } else { | 323 } else { |
| 341 # These could be rather passed as arguments. | 324 # These could be rather passed as arguments. |
| 342 » global exec interp_saved interp | 325 » global interp_saved interp |
| 343 | 326 |
| 344 foreach relink {YES NO} { | 327 foreach relink {YES NO} { |
| 345 # Formerly this test was testing only prelinking of $EXEC. As the | 328 # Formerly this test was testing only prelinking of $EXEC. As the |
| 346 # prelink command automatically prelinks all of $EXEC's libraries, | 329 # prelink command automatically prelinks all of $EXEC's libraries, |
| 347 # even $INTERP got prelinked. Therefore, we formerly had to | 330 # even $INTERP got prelinked. Therefore, we formerly had to |
| 348 # `[file_copy $interp_saved $interp]' to make $INTERP not affected | 331 # `[file_copy $interp_saved $interp]' to make $INTERP not affected |
| 349 # by this prelinking of $EXEC. | 332 # by this prelinking of $EXEC. |
| 350 # | 333 # |
| 351 # But now we need to test even prelinking of $INTERP. We could | 334 # But now we need to test even prelinking of $INTERP. We could |
| 352 # create a separate test to test just the $INTERP prelinking. For | 335 # create a separate test to test just the $INTERP prelinking. For |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 421 if $ifmain { | 404 if $ifmain { |
| 422 test_core $file $displacement | 405 test_core $file $displacement |
| 423 | 406 |
| 424 test_attach $file $displacement | 407 test_attach $file $displacement |
| 425 } | 408 } |
| 426 | 409 |
| 427 if !$trynosym { | 410 if !$trynosym { |
| 428 return | 411 return |
| 429 } | 412 } |
| 430 | 413 |
| 431 global pf_prefix | 414 with_test_prefix "symbol-less" { |
| 432 set old_ldprefix $pf_prefix | 415 » # Test also `exec-file'-command loaded $FILE - therefore |
| 433 lappend pf_prefix "symbol-less:" | 416 » # without symbols. SYMBOL_OBJFILE is not available and only |
| 417 » # EXEC_BFD must be used. |
| 434 | 418 |
| 435 # Test also `exec-file'-command loaded $FILE - therefore without symbols. | 419 » gdb_exit |
| 436 # SYMBOL_OBJFILE is not available and only EXEC_BFD must be used. | 420 » gdb_start |
| 421 » # Clear it to never find any separate debug infos in $debug_root. |
| 422 » gdb_test_no_output "set debug-file-directory" |
| 423 » gdb_reinitialize_dir $srcdir/$subdir |
| 437 | 424 |
| 438 gdb_exit | 425 » # Print the "PIE (Position Independent Executable) |
| 439 gdb_start | 426 » # displacement" message. |
| 440 # Clear it to never find any separate debug infos in $debug_root. | 427 » gdb_test_no_output "set verbose on" |
| 441 gdb_test_no_output "set debug-file-directory" | |
| 442 gdb_reinitialize_dir $srcdir/$subdir | |
| 443 | 428 |
| 444 # Print the "PIE (Position Independent Executable) displacement" message. | 429 » # Test no (error) message has been printed by `exec-file'. |
| 445 gdb_test_no_output "set verbose on" | 430 » set escapedfile [string_to_regexp $file] |
| 431 » gdb_test "exec-file $file" "exec-file $escapedfile" "load" |
| 446 | 432 |
| 447 # Test no (error) message has been printed by `exec-file'. | 433 » if $ifmain { |
| 448 set escapedfile [string_to_regexp $file] | 434 » reach "_dl_debug_state" run $displacement |
| 449 gdb_test "exec-file $file" "exec-file $escapedfile" "load" | |
| 450 | 435 |
| 451 if $ifmain { | 436 » # Use two separate gdb_test_multiple statements to avoid timeouts du
e |
| 452 » reach "_dl_debug_state" run $displacement | 437 » # to slow processing of wildcard capturing long output |
| 438 » set test "info files" |
| 439 » set entrynohex "" |
| 440 » gdb_test_multiple $test $test { |
| 441 » » -re "\r\n\[\t \]*Entry point:\[\t \]*0x(\[0-9a-f\]+)\r\n" { |
| 442 » » set entrynohex $expect_out(1,string) |
| 443 » » gdb_test_multiple "" $test { |
| 444 » » » -re "\r\n$gdb_prompt $" { |
| 445 » » » pass $test |
| 446 » » » } |
| 447 » » } |
| 448 » » } |
| 449 » } |
| 453 | 450 |
| 454 » # Use two separate gdb_test_multiple statements to avoid timeouts due | 451 » # `info sym' cannot be tested for .opd as the binary may not have |
| 455 » # to slow processing of wildcard capturing long output | 452 » # symbols. |
| 456 » set test "info files" | 453 » if {[istarget powerpc64-*] && [is_lp64_target]} { |
| 457 » set entrynohex "" | 454 » » set test "convert entry point" |
| 458 » gdb_test_multiple $test $test { | 455 » » gdb_test_multiple "p *(void(*)(void) *) 0x$entrynohex" $test { |
| 459 » -re "\r\n\[\t \]*Entry point:\[\t \]*0x(\[0-9a-f\]+)\r\n" { | 456 » » -re " =( \\(\[^0-9\]*\\))? 0x(\[0-9a-f\]+)( < \[^\r\n\]*)?\r
\n$gdb_prompt $" { |
| 460 » » set entrynohex $expect_out(1,string) | 457 » » » set entrynohex $expect_out(2,string) |
| 461 » » gdb_test_multiple "" $test { | |
| 462 » » -re "\r\n$gdb_prompt $" { | |
| 463 pass $test | 458 pass $test |
| 464 } | 459 } |
| 465 } | 460 } |
| 466 } | 461 } |
| 467 » } | 462 » if {$entrynohex != ""} { |
| 463 » » gdb_test "break *0x$entrynohex" "" "break at entry point" |
| 464 » » gdb_test "continue" "\r\nBreakpoint \[0-9\]+, 0x0*$entrynohex in
.*" "entry point reached" |
| 465 » } |
| 466 » } else { |
| 467 » # There is no symbol to break at ld.so. Moreover it can |
| 468 » # exit with an error code. |
| 468 | 469 |
| 469 » # `info sym' cannot be tested for .opd as the binary may not have | 470 » set test "ld.so exit" |
| 470 » # symbols. | 471 » set test_displacement "seen displacement message as $displacement" |
| 471 » if {[istarget powerpc64-*] && [is_lp64_target]} { | 472 » gdb_test_multiple "run" $test { |
| 472 » set test "convert entry point" | 473 » » -re "Using PIE \\(Position Independent Executable\\) displacemen
t (0x\[0-9a-f\]+) " { |
| 473 » gdb_test_multiple "p *(void(*)(void) *) 0x$entrynohex" $test { | 474 » » # Missing "$gdb_prompt $" is intentional. |
| 474 » » -re " =( \\(\[^0-9\]*\\))? 0x(\[0-9a-f\]+)( < \[^\r\n\]*)?\r\n$g
db_prompt $" { | 475 » » if {$expect_out(1,string) == "0x0"} { |
| 475 » » set entrynohex $expect_out(2,string) | 476 » » » set case "ZERO" |
| 477 » » } else { |
| 478 » » » set case "NONZERO" |
| 479 » » } |
| 480 » » if {$displacement == $case || $displacement == "PRESENT"} { |
| 481 » » » pass $test_displacement |
| 482 » » » set displacement "FOUND-$displacement" |
| 483 » » } else { |
| 484 » » » fail $test_displacement |
| 485 » » } |
| 486 » » exp_continue |
| 487 » » } |
| 488 » » -re "$inferior_exited_re (normally|with code \[0-9\]+).\r\n$gdb_
prompt $" { |
| 489 » » # Do not check the binary filename as it may be truncated. |
| 476 pass $test | 490 pass $test |
| 477 } | 491 } |
| 478 } | 492 } |
| 479 » } | 493 » if ![regexp {^(NONE|FOUND-.*)$} $displacement] { |
| 480 » if {$entrynohex != ""} { | 494 » » fail $test_displacement |
| 481 » gdb_test "break *0x$entrynohex" "" "break at entry point" | |
| 482 » gdb_test "continue" "\r\nBreakpoint \[0-9\]+, 0x0*$entrynohex in .*"
"entry point reached" | |
| 483 » } | |
| 484 } else { | |
| 485 » # There is no symbol to break at ld.so. Moreover it can exit with an | |
| 486 » # error code. | |
| 487 | |
| 488 » set test "ld.so exit" | |
| 489 » set test_displacement "seen displacement message as $displacement" | |
| 490 » gdb_test_multiple "run" $test { | |
| 491 » -re "Using PIE \\(Position Independent Executable\\) displacement (0
x\[0-9a-f\]+) " { | |
| 492 » » # Missing "$gdb_prompt $" is intentional. | |
| 493 » » if {$expect_out(1,string) == "0x0"} { | |
| 494 » » set case "ZERO" | |
| 495 » » } else { | |
| 496 » » set case "NONZERO" | |
| 497 » » } | |
| 498 » » if {$displacement == $case || $displacement == "PRESENT"} { | |
| 499 » » pass $test_displacement | |
| 500 » » set displacement "FOUND-$displacement" | |
| 501 » » } else { | |
| 502 » » fail $test_displacement | |
| 503 » » } | |
| 504 » » exp_continue | |
| 505 » } | |
| 506 » -re "$inferior_exited_re (normally|with code \[0-9\]+).\r\n$gdb_prom
pt $" { | |
| 507 » » # Do not check the binary filename as it may be truncated. | |
| 508 » » pass $test | |
| 509 } | 495 } |
| 510 } | 496 } |
| 511 if ![regexp {^(NONE|FOUND-.*)$} $displacement] { | |
| 512 fail $test_displacement | |
| 513 } | |
| 514 } | 497 } |
| 515 | |
| 516 set pf_prefix $old_ldprefix | |
| 517 } | 498 } |
| 518 | 499 |
| 519 # Create separate binaries for each testcase - to make the possible reported | 500 # Create separate binaries for each testcase - to make the possible reported |
| 520 # problem reproducible after the whole test run finishes. | 501 # problem reproducible after the whole test run finishes. |
| 521 | 502 |
| 522 set old_ldprefix $pf_prefix | |
| 523 foreach ldprelink {NO YES} { | 503 foreach ldprelink {NO YES} { |
| 524 foreach ldsepdebug {NO IN SEP} { | 504 foreach ldsepdebug {NO IN SEP} { |
| 525 # Skip running the ldsepdebug test if we do not have system separate | 505 # Skip running the ldsepdebug test if we do not have system separate |
| 526 # debug info available. | 506 # debug info available. |
| 527 if {$interp_system_debug == "" && $ldsepdebug == "SEP"} { | 507 if {$interp_system_debug == "" && $ldsepdebug == "SEP"} { |
| 528 continue | 508 continue |
| 529 } | 509 } |
| 530 | 510 |
| 531 set ldname "LDprelink${ldprelink}debug${ldsepdebug}" | 511 set ldname "LDprelink${ldprelink}debug${ldsepdebug}" |
| 532 set interp $binprefix-$ldname | 512 set interp $binprefix-$ldname |
| 533 | 513 |
| 534 # prelink needs to always prelink all the dependencies to do any file | 514 # prelink needs to always prelink all the dependencies to do any file |
| 535 # modifications of its files. ld.so also needs all the dependencies to | 515 # modifications of its files. ld.so also needs all the dependencies to |
| 536 # be prelinked to omit the relocation process. In-memory file offsets | 516 # be prelinked to omit the relocation process. In-memory file offsets |
| 537 # are not dependent whether ld.so went the prelink way or through the | 517 # are not dependent whether ld.so went the prelink way or through the |
| 538 # relocation process. | 518 # relocation process. |
| 539 # | 519 # |
| 540 # For GDB we are not interested whether prelink succeeds as it is | 520 # For GDB we are not interested whether prelink succeeds as it is |
| 541 # transparent to GDB. GDB is being tested for differences of file | 521 # transparent to GDB. GDB is being tested for differences of file |
| 542 # offsets vs. in-memory offsets. So we have to prelink even ld.so for | 522 # offsets vs. in-memory offsets. So we have to prelink even ld.so for |
| 543 # the BIN modification to happen but we need to restore the original | 523 # the BIN modification to happen but we need to restore the original |
| 544 # possibly unprelinked ld.so to test all the combinations for GDB. | 524 # possibly unprelinked ld.so to test all the combinations for GDB. |
| 545 set interp_saved ${interp}-saved | 525 set interp_saved ${interp}-saved |
| 546 | 526 |
| 547 » set pf_prefix $old_ldprefix | 527 » with_test_prefix "$ldname" { |
| 548 » lappend pf_prefix "$ldname:" | 528 » if {$ldsepdebug == "NO"} { |
| 529 » » file_copy $interp_system $interp |
| 530 » » # Never call strip-debug before unprelink: |
| 531 » » # prelink: ...: Section .note.gnu.build-id created after prelink
ing |
| 532 » » if ![prelinkNO $interp] { |
| 533 » » continue |
| 534 » » } |
| 535 » » strip_debug $interp |
| 536 » } elseif {$ldsepdebug == "IN" && $interp_system_debug == ""} { |
| 537 » » file_copy $interp_system $interp |
| 538 » } elseif {$ldsepdebug == "IN" && $interp_system_debug != ""} { |
| 539 » file_copy $interp_system $interp |
| 540 » » file_copy $interp_system_debug "${interp}.debug" |
| 541 » » # eu-unstrip: DWARF data in '...' not adjusted for prelinking bi
as; consider prelink -u |
| 542 » » if {![prelinkNO $interp] || ![prelinkNO "${interp}.debug"]} { |
| 543 » » continue |
| 544 » » } |
| 545 » » set test "eu-unstrip unprelinked:[file tail $interp_system] + [f
ile tail $interp_system_debug] to [file tail $interp]" |
| 546 » » set command "exec eu-unstrip -o $interp $interp ${interp}.debug" |
| 547 » » verbose -log "command is $command" |
| 548 » » if [catch $command] { |
| 549 » » setup_xfail *-*-* |
| 550 » » fail $test |
| 551 » » continue |
| 552 » » } else { |
| 553 » » pass $test |
| 554 » » } |
| 555 » } elseif {$ldsepdebug == "SEP" && $interp_system_debug == ""} { |
| 556 » » file_copy $interp_system $interp |
| 557 » » # eu-unstrip: DWARF data in '...' not adjusted for prelinking bi
as; consider prelink -u |
| 558 » » if ![prelinkNO $interp] { |
| 559 » » continue |
| 560 » » } |
| 561 » » gdb_gnu_strip_debug $interp |
| 562 » } elseif {$ldsepdebug == "SEP" && $interp_system_debug != ""} { |
| 563 » » file_copy $interp_system $interp |
| 564 » » file_copy $interp_system_debug "${interp}.debug" |
| 565 » } |
| 549 | 566 |
| 550 » if {$ldsepdebug == "NO"} { | 567 » if {$ldsepdebug == "SEP"} { |
| 551 » file_copy $interp_system $interp | 568 » » if ![prelinkNO "${interp}.debug"] { |
| 552 » # Never call strip-debug before unprelink: | 569 » » continue |
| 553 » # prelink: ...: Section .note.gnu.build-id created after prelinking | 570 » » } |
| 554 » if ![prelinkNO $interp] { | 571 » } else { |
| 572 » » file delete "${interp}.debug" |
| 573 » } |
| 574 |
| 575 » if ![prelink$ldprelink $interp] { |
| 555 continue | 576 continue |
| 556 } | 577 } |
| 557 » strip_debug $interp | 578 » if {$ldprelink == "NO"} { |
| 558 » } elseif {$ldsepdebug == "IN" && $interp_system_debug == ""} { | 579 » » set displacement "NONZERO" |
| 559 » file_copy $interp_system $interp | 580 » } else { |
| 560 » } elseif {$ldsepdebug == "IN" && $interp_system_debug != ""} { | 581 » » # x86* kernel loads prelinked PIE binary at its |
| 561 » file_copy $interp_system $interp | 582 » » # prelinked address but ppc* kernel loads it at a |
| 562 » file_copy $interp_system_debug "${interp}.debug" | 583 » » # random address. prelink normally skips PIE binaries |
| 563 » # eu-unstrip: DWARF data in '...' not adjusted for prelinking bias;
consider prelink -u | 584 » » # during the system scan. |
| 564 » if {![prelinkNO $interp] || ![prelinkNO "${interp}.debug"]} { | 585 » » set displacement "PRESENT" |
| 586 » } |
| 587 » test_ld $interp 0 [expr {$ldsepdebug == "NO"}] $displacement |
| 588 |
| 589 » if ![file_copy $interp $interp_saved] { |
| 565 continue | 590 continue |
| 566 } | 591 } |
| 567 set test "eu-unstrip unprelinked:[file tail $interp_system] + [file
tail $interp_system_debug] to [file tail $interp]" | |
| 568 set command "exec eu-unstrip -o $interp $interp ${interp}.debug" | |
| 569 verbose -log "command is $command" | |
| 570 if [catch $command] { | |
| 571 setup_xfail *-*-* | |
| 572 fail $test | |
| 573 continue | |
| 574 } else { | |
| 575 pass $test | |
| 576 } | |
| 577 } elseif {$ldsepdebug == "SEP" && $interp_system_debug == ""} { | |
| 578 file_copy $interp_system $interp | |
| 579 # eu-unstrip: DWARF data in '...' not adjusted for prelinking bias;
consider prelink -u | |
| 580 if ![prelinkNO $interp] { | |
| 581 continue | |
| 582 } | |
| 583 gdb_gnu_strip_debug $interp | |
| 584 } elseif {$ldsepdebug == "SEP" && $interp_system_debug != ""} { | |
| 585 file_copy $interp_system $interp | |
| 586 file_copy $interp_system_debug "${interp}.debug" | |
| 587 } | |
| 588 | 592 |
| 589 » if {$ldsepdebug == "SEP"} { | 593 » foreach binprelink {NO YES} { |
| 590 » if ![prelinkNO "${interp}.debug"] { | 594 » » foreach binsepdebug {NO IN SEP} { |
| 591 » » continue | 595 » » # "ATTACH" is like "YES" but it is modified during |
| 592 » } | 596 » » # run. It cannot be used for problem |
| 593 » } else { | 597 » » # reproducibility after the testcase ends. |
| 594 » file delete "${interp}.debug" | 598 » » foreach binpie {NO YES ATTACH} { |
| 595 » } | 599 » » » # This combination is not possible, non-PIE (fixed addre
ss) |
| 600 » » » # binary cannot be prelinked to any (other) address. |
| 601 » » » if {$binprelink == "YES" && $binpie == "NO"} { |
| 602 » » » continue |
| 603 » » » } |
| 596 | 604 |
| 597 » if ![prelink$ldprelink $interp] { | 605 » » » set binname "BINprelink${binprelink}debug${binsepdebug}p
ie${binpie}" |
| 598 » continue | 606 » » » set exec $binprefix-$binname |
| 599 » } | |
| 600 » if {$ldprelink == "NO"} { | |
| 601 » set displacement "NONZERO" | |
| 602 » } else { | |
| 603 » # x86* kernel loads prelinked PIE binary at its prelinked address | |
| 604 » # but ppc* kernel loads it at a random address. prelink normally | |
| 605 » # skips PIE binaries during the system scan. | |
| 606 » set displacement "PRESENT" | |
| 607 » } | |
| 608 » test_ld $interp 0 [expr {$ldsepdebug == "NO"}] $displacement | |
| 609 | 607 |
| 610 » if ![file_copy $interp $interp_saved] { | 608 » » » with_test_prefix "$binname" { |
| 611 » continue | 609 » » » set opts "ldflags=-Wl,$binfile_lib,-rpath,[file dirn
ame $binfile_lib]" |
| 612 » } | 610 » » » if {$binsepdebug != "NO"} { |
| 613 » set old_binprefix $pf_prefix | 611 » » » » lappend opts {debug} |
| 614 » foreach binprelink {NO YES} { | 612 » » » } |
| 615 » foreach binsepdebug {NO IN SEP} { | 613 » » » if {$binpie != "NO"} { |
| 616 » » # "ATTACH" is like "YES" but it is modified during run. | 614 » » » » lappend opts {additional_flags=-fPIE -pie} |
| 617 » » # It cannot be used for problem reproducibility after the | 615 » » » } |
| 618 » » # testcase ends. | |
| 619 » » foreach binpie {NO YES ATTACH} { | |
| 620 » » # This combination is not possible, non-PIE (fixed address) | |
| 621 » » # binary cannot be prelinked to any (other) address. | |
| 622 » » if {$binprelink == "YES" && $binpie == "NO"} { | |
| 623 » » » continue | |
| 624 » » } | |
| 625 | 616 |
| 626 » » set binname "BINprelink${binprelink}debug${binsepdebug}pie${
binpie}" | 617 » » » set dir ${exec}.d |
| 627 » » set exec $binprefix-$binname | 618 » » » set relink_args [build_executable_own_libs ${test}.e
xp [file tail $exec] $srcfile $opts $interp $dir] |
| 619 » » » if {$relink_args == ""} { |
| 620 » » » » continue; |
| 621 » » » } |
| 628 | 622 |
| 629 » » set pf_prefix $old_binprefix | 623 » » » if {$binsepdebug == "SEP"} { |
| 630 » » lappend pf_prefix "$binname:" | 624 » » » » gdb_gnu_strip_debug $exec |
| 625 » » » } |
| 631 | 626 |
| 632 » » set opts "ldflags=-Wl,$binfile_lib,-rpath,[file dirname $bin
file_lib]" | 627 » » » if {$binpie == "NO"} { |
| 633 » » if {$binsepdebug != "NO"} { | 628 » » » » set displacement "NONE" |
| 634 » » » lappend opts {debug} | 629 » » » } elseif {$binprelink == "NO"} { |
| 635 » » } | 630 » » » » set displacement "NONZERO" |
| 636 » » if {$binpie != "NO"} { | 631 » » » } else { |
| 637 » » » lappend opts {additional_flags=-fPIE -pie} | 632 » » » » # x86* kernel loads prelinked PIE binary at its
prelinked |
| 638 » » } | 633 » » » » # address but ppc* kernel loads it at a random a
ddress. |
| 634 » » » » # prelink normally skips PIE binaries during the
system scan. |
| 635 » » » » set displacement "PRESENT" |
| 636 » » » } |
| 639 | 637 |
| 640 » » set dir ${exec}.d | 638 » » » if {[prelink$binprelink $relink_args [file tail $exe
c]] |
| 641 » » set relink_args [build_executable_own_libs ${test}.exp [file
tail $exec] $srcfile $opts $interp $dir] | 639 » » » » && [file_copy $interp_saved $interp]} { |
| 642 » » if {$relink_args == ""} { | 640 » » » » if {$binpie != "ATTACH"} { |
| 643 » » » continue; | 641 » » » » test_ld $exec 1 [expr {$binsepdebug == "NO"}
] $displacement |
| 644 » » } | 642 » » » » } else { |
| 643 » » » » # If the file has been randomly prelinked it
must be |
| 644 » » » » # "NONZERO". We could see "ZERO" only if it
was unprelinked |
| 645 » » » » # and it is now running at the same address
- which is 0 but |
| 646 » » » » # executable can never run at address 0. |
| 645 | 647 |
| 646 » » if {$binsepdebug == "SEP"} { | 648 » » » » set displacement "NONZERO" |
| 647 » » » gdb_gnu_strip_debug $exec | 649 » » » » test_attach $exec $displacement $relink_args |
| 648 » » } | |
| 649 | 650 |
| 650 » » if {$binpie == "NO"} { | 651 » » » » # ATTACH means that executables and librarie
s have been |
| 651 » » » set displacement "NONE" | 652 » » » » # modified after they have been run. They c
annot be reused |
| 652 » » } elseif {$binprelink == "NO"} { | 653 » » » » # for problem reproducibility after the test
case ends in |
| 653 » » » set displacement "NONZERO" | 654 » » » » # the ATTACH case. Therefore they are rathe
r deleted not |
| 654 » » } else { | 655 » » » » # to confuse after the run finishes. |
| 655 » » » # x86* kernel loads prelinked PIE binary at its | 656 » » » » set exec_debug [system_debug_get $exec] |
| 656 » » » # prelinked address but ppc* kernel loads it at | 657 » » » » if {$exec_debug != ""} { |
| 657 » » » # a random address. prelink normally skips PIE | 658 » » » » » # `file delete [glob "${exec_debug}*"]'
does not work. |
| 658 » » » # binaries during the system scan. | 659 » » » » » foreach f [glob "${exec_debug}*"] { |
| 659 » » » set displacement "PRESENT" | 660 » » » » » file delete $f |
| 660 » » } | 661 » » » » » } |
| 661 | 662 » » » » } |
| 662 » » if {[prelink$binprelink $relink_args [file tail $exec]] | 663 » » » » file delete -force $dir |
| 663 » » && [file_copy $interp_saved $interp]} { | 664 » » » » # `file delete [glob "${exec}*"]' does not w
ork. |
| 664 » » » if {$binpie != "ATTACH"} { | 665 » » » » foreach f [glob "${exec}*"] { |
| 665 » » » test_ld $exec 1 [expr {$binsepdebug == "NO"}] $displ
acement | 666 » » » » » file delete $f |
| 666 » » » } else { | 667 » » » » } |
| 667 » » » # If the file has been randomly prelinked it must | |
| 668 » » » # be "NONZERO". We could see "ZERO" only if it was | |
| 669 » » » # unprelinked and it is now running at the same | |
| 670 » » » # address - which is 0 but executable can never run | |
| 671 » » » # at address 0. | |
| 672 | |
| 673 » » » set displacement "NONZERO" | |
| 674 » » » test_attach $exec $displacement $relink_args | |
| 675 | |
| 676 » » » # ATTACH means that executables and libraries have | |
| 677 » » » # been modified after they have been run. They | |
| 678 » » » # cannot be reused for problem reproducibility after | |
| 679 » » » # the testcase ends in the ATTACH case. Therefore | |
| 680 » » » # they are rather deleted not to confuse after the | |
| 681 » » » # run finishes. | |
| 682 » » » set exec_debug [system_debug_get $exec] | |
| 683 » » » if {$exec_debug != ""} { | |
| 684 » » » » # `file delete [glob "${exec_debug}*"]' does not
work. | |
| 685 » » » » foreach f [glob "${exec_debug}*"] { | |
| 686 » » » » file delete $f | |
| 687 } | 668 } |
| 688 } | 669 } |
| 689 file delete -force $dir | |
| 690 # `file delete [glob "${exec}*"]' does not work. | |
| 691 foreach f [glob "${exec}*"] { | |
| 692 file delete $f | |
| 693 } | |
| 694 } | 670 } |
| 695 } | 671 } |
| 696 } | 672 } |
| 697 } | 673 } |
| 674 |
| 675 file delete $interp_saved |
| 698 } | 676 } |
| 699 | |
| 700 file delete $interp_saved | |
| 701 } | 677 } |
| 702 } | 678 } |
| 703 set pf_prefix $old_ldprefix | |
| OLD | NEW |