blob: b49770f4a5eef2e85287565e32997c787804b829 [file] [log] [blame]
# Copyright 2022-2023 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# This test triggers the "separate debug info file has no debug info" warning by replacing
# the build-id based .debug file with the stripped binary and then loading it to gdb.
# It then also sets up local debuginfod server with the correct debug file to download
# to make sure no warnings are emmitted.
standard_testfile
load_lib debuginfod-support.exp
require allow_debuginfod_tests
if {[build_executable "build executable" ${testfile} ${srcfile} \
{debug build-id}] == -1} {
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.
#
# 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.
if {[gdb_gnu_strip_debug $binfile no-debuglink]} {
unsupported "cannot produce separate debug info files"
return -1
}
# Get the .build-id/PREFIX/SUFFIX.debug file name, and convert it to
# an absolute path, this is where we will place the debug information.
set build_id_debug_file \
[standard_output_file [build_id_debug_filename_get $binfile]]
# Get the BINFILE.debug filename. This is the file we should be
# moving to the BUILD_ID_DEBUG_FILE location, but we wont, we're going
# to move something else there instead.
set debugfile [standard_output_file "${binfile}.debug"]
# Move debugfile to the directory to be used by the debuginfod
# server.
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}]
remote_exec build "mkdir -p $debugdir"
# Now move the stripped executable into the .build-id directory
# instead of the debug information. Later on we're going to try and
# load this into GDB. GDB will then try to find the separate debug
# 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}"
# Now start GDB.
clean_restart
# Tell GDB where to look for the .build-id directory.
set debug_file_directory [standard_output_file ""]
gdb_test_no_output "set debug-file-directory ${debug_file_directory}" \
"set debug-file-directory"
# Now load the file into GDB, and look for the warning.
set debug_file_re [string_to_regexp $build_id_debug_file]
gdb_test "file ${build_id_debug_file}" \
[multi_line \
"Reading symbols from $debug_file_re\\.\\.\\." \
"warning: \"$debug_file_re\": separate debug info file has no debug info" \
"\\(No debugging symbols found in \[^\r\n\]+\\)"] \
"load test file, expect a warning"
# Now we should close GDB.
gdb_exit
# Create CACHE and DB directories ready for debuginfod to use.
prepare_for_debuginfod cache db
# Start debuginfod server and test debuginfo is downloaded from
# it and we can se no warnings anymore.
proc_with_prefix local_debuginfod { } {
global db debuginfod_debugdir cache build_id_debug_file
set url [start_debuginfod $db $debuginfod_debugdir]
if {$url eq ""} {
unresolved "failed to start debuginfod server"
return
}
# Point the client to the server.
setenv DEBUGINFOD_URLS $url
# GDB should now find the symbol and source files.
clean_restart
# Enable debuginfod and fetch the debuginfo.
gdb_test_no_output "set debuginfod enabled on"
# "separate debug info file has no debug info" warning should not be
# reported now because the correct debuginfo should be fetched from
# debuginfod.
gdb_test "file ${build_id_debug_file}" \
[multi_line \
"Reading symbols from ${build_id_debug_file}\\.\\.\\." \
"Downloading separate debug info for ${build_id_debug_file}\\.\\.\\." \
"Reading symbols from ${cache}/\[^\r\n\]+\\.\\.\\.(?:\r\nExpanding full symbols from \[^\r\n\]+)*"] \
"debuginfod running, info downloaded, no warnings"
}
# Restart GDB, and load the file, this time we should correctly get
# the debug symbols from the server, and should not see the warning.
with_debuginfod_env $cache {
local_debuginfod
}
stop_debuginfod
# Spare debug files may confuse testsuite runs in the future.
remote_exec build "rm -f $debugfile"