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>
This commit is contained in:
Andrew Burgess 2024-05-18 11:05:49 +01:00
parent 92a89ee1d9
commit 9543c37620
3 changed files with 25 additions and 37 deletions

View File

@ -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"
}

View File

@ -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

View File

@ -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
}