aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorAndrew Burgess <aburgess@redhat.com>2024-05-18 11:05:49 +0100
committerAndrew Burgess <aburgess@redhat.com>2024-06-04 13:33:31 +0100
commit9543c37620c9483f77f0f728f32e6517987c7b4c (patch)
tree142a8303af92578d7fdea9dbfc44820284f29fab /gdb
parent92a89ee1d99c200adb13728b549222d71b6349ad (diff)
downloadgdb-9543c37620c9483f77f0f728f32e6517987c7b4c.zip
gdb-9543c37620c9483f77f0f728f32e6517987c7b4c.tar.gz
gdb-9543c37620c9483f77f0f728f32e6517987c7b4c.tar.bz2
gdb/testsuite: make gdb_gnu_strip_debug consistent
While writing a test I realised that the default behaviour of gdb_gnu_strip_debug doesn't match its comment. The comment says that the function takes a FILENAME, and splits the file into FILENAME.stripped and FILENAME.debug, leaving FILENAME unchanged. The comment says that a .gnu_debuglink will be added to FILENAME.stripped. However, this is not true, FILENAME.stripped is created, with no debug information. FILENAME.debug is created containing the debug information. But, when adding the .gnu_debuglink we take FILENAME.stripped as the input, and then overwrite FILENAME with the output. As a result, FILENAME.stripped does not include a .gnu_debuglink, while FILENAME contains the .gnu_debuglink and no debug information! The users of gdb_gnu_strip_debug can be split into two groups, those who are using the .gnu_debuglink, these tests are all written assuming that FILENAME is updated. Then there are some tests that only rely on gdb_gnu_strip_debug's ability to split out the debug information, these tests are then going to do a lookup based on the build-id, these tests don't require the .gnu_debuglink. These tests use the FILENAME.stripped output file. This all seems too confused to me. As most uses of gdb_gnu_strip_debug assume that FILENAME is updated, I propose that we just make that the actual, advertised behaviour of this proc. So now, gdb_gnu_strip_debug will take FILENAME, and will split the debug information out into FILENAME.debug. The debug information will then be stripped from FILENAME, and by default a .gnu_debuglink will be added to FILENAME pointing to FILENAME.debug. I've updated the two tests that actually relied on FILENAME.stripped to instead just use FILENAME. One of the tests was doing a build-id based lookup, but was still allowing the .gnu_debuglink to be added to FILENAME, I've updated this test to pass the no-debuglink flag to gdb_gnu_strip_debug, which stops the .gnu_debuglink from being added. All of the tests that call gdb_gnu_strip_debug still pass for me. Acked-By: Tom de Vries <tdevries@suse.de>
Diffstat (limited to 'gdb')
-rw-r--r--gdb/testsuite/gdb.base/corefile-buildid.exp18
-rw-r--r--gdb/testsuite/gdb.debuginfod/build-id-no-debug-warning.exp19
-rw-r--r--gdb/testsuite/lib/gdb.exp25
3 files changed, 25 insertions, 37 deletions
diff --git a/gdb/testsuite/gdb.base/corefile-buildid.exp b/gdb/testsuite/gdb.base/corefile-buildid.exp
index 1301986..e1b9804 100644
--- a/gdb/testsuite/gdb.base/corefile-buildid.exp
+++ b/gdb/testsuite/gdb.base/corefile-buildid.exp
@@ -172,11 +172,9 @@ proc locate_exec_from_core_build_id {corefile buildid suffix \
"mkdir -p [file join $debugdir [file dirname $buildid]]"
set files_list {}
+ lappend files_list $binfile $buildid
if {$sepdebug} {
- lappend files_list "$binfile.stripped" $buildid
lappend files_list "$binfile.debug" "$buildid.debug"
- } else {
- lappend files_list $binfile $buildid
}
if {$shared} {
global sharedir
@@ -200,12 +198,7 @@ proc locate_exec_from_core_build_id {corefile buildid suffix \
gdb_test "core-file $corefile" "Program terminated with .*" \
"load core file"
if {$symlink} {
- if {$sepdebug} {
- set expected_file [file join $builddir \
- [file tail "$binfile.stripped"]]
- } else {
- set expected_file [file join $builddir [file tail $binfile]]
- }
+ set expected_file [file join $builddir [file tail $binfile]]
} else {
set expected_file $buildid
}
@@ -245,15 +238,12 @@ proc do_corefile_buildid_tests {args} {
if {$sepdebug} {
# Strip debuginfo into its own file.
- if {[gdb_gnu_strip_debug [standard_output_file $program_to_run]] \
- != 0} {
+ if {[gdb_gnu_strip_debug [standard_output_file $program_to_run] \
+ no-debuglink] != 0} {
untested "could not strip executable for [join $suffix \ ]"
return
}
- # Run the stripped program instead of the original.
- set program_to_run [file join $builddir \
- [file tail "$binfile.stripped"]]
lappend suffix "sepdebug"
}
diff --git a/gdb/testsuite/gdb.debuginfod/build-id-no-debug-warning.exp b/gdb/testsuite/gdb.debuginfod/build-id-no-debug-warning.exp
index b866225..aa1c263 100644
--- a/gdb/testsuite/gdb.debuginfod/build-id-no-debug-warning.exp
+++ b/gdb/testsuite/gdb.debuginfod/build-id-no-debug-warning.exp
@@ -30,14 +30,11 @@ if {[build_executable "build executable" ${testfile} ${srcfile} \
return -1
}
-# Split BINFILE into BINFILE.stripped and BINFILE.debug, the first is
-# the executable with the debug information removed, and the second is
-# the debug information.
+# Split debug information from BINFILE into BINFILE.debug.
#
-# However, by passing the "no-debuglink" flag we prevent this proc
-# from adding a .gnu_debuglink section to the executable. Any lookup
-# of the debug information by GDB will need to be done based on the
-# build-id.
+# By passing the "no-debuglink" flag we prevent this proc from adding
+# a .gnu_debuglink section to BINFILE. Any lookup of the debug
+# information by GDB will need to be done based on the build-id.
if {[gdb_gnu_strip_debug $binfile no-debuglink]} {
unsupported "cannot produce separate debug info files"
return -1
@@ -59,12 +56,6 @@ set debuginfod_debugdir [standard_output_file "debug"]
remote_exec build "mkdir $debuginfod_debugdir"
remote_exec build "mv $debugfile $debuginfod_debugdir"
-# This is BINFILE with the debug information removed. We are going to
-# place this in the BUILD_ID_DEBUG_FILE location, this would usually
-# represent a mistake by the user, and will trigger a warning from
-# GDB, this is the warning we are checking for.
-set stripped_binfile [standard_output_file "${binfile}.stripped"]
-
# Create the .build-id/PREFIX directory name from
# .build-id/PREFIX/SUFFIX.debug filename.
set debugdir [file dirname ${build_id_debug_file}]
@@ -76,7 +67,7 @@ remote_exec build "mkdir -p $debugdir"
# information, which will point back at this file, which also doesn't
# have debug information, which could cause a loop. But GDB will spot
# this and give a warning.
-remote_exec build "mv ${stripped_binfile} ${build_id_debug_file}"
+remote_exec build "mv ${binfile} ${build_id_debug_file}"
# Now start GDB.
clean_restart
diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
index cdc3721..0fab866 100644
--- a/gdb/testsuite/lib/gdb.exp
+++ b/gdb/testsuite/lib/gdb.exp
@@ -8057,10 +8057,11 @@ proc build_id_debug_filename_get { filename } {
}
# DEST should be a file compiled with debug information. This proc
-# creates two new files DEST.debug which contains the debug
-# information extracted from DEST, and DEST.stripped, which is a copy
-# of DEST with the debug information removed. A '.gnu_debuglink'
-# section will be added to DEST.stripped that points to DEST.debug.
+# creates DEST.debug which contains the debug information extracted
+# from DEST, and DEST is updated with the debug information removed.
+#
+# By default a '.gnu_debuglink' section will be added to DEST that
+# points to DEST.debug.
#
# If ARGS is passed, it is a list of optional flags. The currently
# supported flags are:
@@ -8068,7 +8069,7 @@ proc build_id_debug_filename_get { filename } {
# - no-main : remove the symbol entry for main from the separate
# debug file DEST.debug,
# - no-debuglink : don't add the '.gnu_debuglink' section to
-# DEST.stripped.
+# DEST.
#
# Function returns zero on success. Function will return non-zero failure code
# on some targets not supporting separate debug info (such as i386-msdos).
@@ -8127,20 +8128,26 @@ proc gdb_gnu_strip_debug { dest args } {
# Unless the "no-debuglink" flag is passed, then link the two
# previous output files together, adding the .gnu_debuglink
# section to the stripped_file, containing a pointer to the
- # debug_file, save the new file in dest.
+ # debug_file.
if {[lsearch -exact $args "no-debuglink"] == -1} {
- set result [catch "exec $objcopy_program --add-gnu-debuglink=${debug_file} ${stripped_file} ${dest}" output]
+ set result [catch "exec $objcopy_program --add-gnu-debuglink=${debug_file} ${stripped_file} ${stripped_file}-tmp" output]
verbose "result is $result"
verbose "output is $output"
if {$result == 1} {
return 1
}
+ file delete "${stripped_file}"
+ file rename "${stripped_file}-tmp" "${stripped_file}"
}
# Workaround PR binutils/10802:
# Preserve the 'x' bit also for PIEs (Position Independent Executables).
- set perm [file attributes ${stripped_file} -permissions]
- file attributes ${dest} -permissions $perm
+ set perm [file attributes ${dest} -permissions]
+ file attributes ${stripped_file} -permissions $perm
+
+ # Move the stripped_file back into dest.
+ file delete ${dest}
+ file rename ${stripped_file} ${dest}
return 0
}