# Copyright 2022-2024 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 . # # This test compiles two executables: crc_mismatch and crc_mismatch-2 # and then strips them of debuginfo creating separate debug files. The test # then replaces crc_mismatch-2.debug with crc_mismatch.debug to trigger # "CRC mismatch" warning. A local debuginfod server is setup to supply # the correct debug file, now when GDB looks up the debug info no warning # is given. standard_testfile .c -2.c load_lib debuginfod-support.exp require allow_debuginfod_tests if {[build_executable "build executable" $testfile $srcfile debug] == -1} { untested "failed to compile" return -1 } # The procedure gdb_gnu_strip_debug will produce an executable called # ${binfile}, which is just like the executable ($binfile) but without # the debuginfo. Instead $binfile has a .gnu_debuglink section which # contains the name of a debuginfo only file. if {[gdb_gnu_strip_debug $binfile]} { # Check that you have a recent version of strip and objcopy installed. unsupported "cannot produce separate debug info files" return -1 } set debugfile [standard_output_file ${testfile}.debug] set debugdir [standard_output_file "debug"] remote_exec build "mkdir $debugdir" remote_exec build "mkdir -p [file dirname $debugfile]" remote_exec build "mv -f [standard_output_file ${testfile}.debug] $debugfile" # Test CRC mismatch is reported. if {[build_executable crc_mismatch.exp crc_mismatch-2 crc_mismatch-2.c debug] != -1 && ![gdb_gnu_strip_debug [standard_output_file crc_mismatch-2]]} { # Copy the correct debug file for crc_mismatch-2 to the debugdir # which is going to be used by local debuginfod. remote_exec build "cp [standard_output_file crc_mismatch-2.debug] ${debugdir}" # Move the unmatching debug file for crc_mismatch-2 instead of its real one # to trigger the "CRC mismatch" warning. remote_exec build "mv ${debugfile} [standard_output_file crc_mismatch-2.debug]" clean_restart set escapedobjdirsubdir [string_to_regexp [standard_output_file {}]] gdb_test "file [standard_output_file crc_mismatch-2]" \ [multi_line \ "Reading symbols from ${escapedobjdirsubdir}/crc_mismatch-2\\.\\.\\." \ "warning: the debug information found in \"${escapedobjdirsubdir}/crc_mismatch-2\\.debug\" does not match \"${escapedobjdirsubdir}/crc_mismatch-2\" \\(CRC mismatch\\)\\." \ "\\(No debugging symbols found in .*\\)"] \ "CRC mismatch is reported" # Do the same thing again, but this time check that the styling is # correct. with_test_prefix "check styling" { with_ansi_styling_terminal { clean_restart set debug_file_re [style "${escapedobjdirsubdir}/crc_mismatch-2\\.debug" file] set exe_file_re [style "${escapedobjdirsubdir}/crc_mismatch-2" file] gdb_test "file [standard_output_file crc_mismatch-2]" \ [multi_line \ "Reading symbols from ${exe_file_re}\\.\\.\\." \ "warning: the debug information found in \"${debug_file_re}\" does not match \"${exe_file_re}\" \\(CRC mismatch\\)\\." \ "\\(No debugging symbols found in \[^\r\n\]+\\)"] \ "CRC mismatch is reported" } } # Restart GDB with styling disabled. clean_restart } # Create CACHE and DB directories ready for debuginfod to use. prepare_for_debuginfod cache db # Start debuginfod server, test the correct debuginfo was fetched # from the server so there're not warnings anymore. proc_with_prefix local_debuginfod { } { global binfile db debugdir cache set escapedobjdirsubdir [string_to_regexp [standard_output_file {}]] set url [start_debuginfod $db $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" gdb_test "file $binfile" ".*Reading symbols from.*debuginfo.*" \ "file [file tail $binfile] cmd on" # CRC mismatch should not be reported now because the correct debuginfo # should be fetched from debuginfod. gdb_test "file [standard_output_file crc_mismatch-2]" \ [multi_line \ "Reading symbols from ${escapedobjdirsubdir}/crc_mismatch-2\\.\\.\\." \ "Downloading.*separate debug info for ${escapedobjdirsubdir}/crc_mismatch-2\\.\\.\\." \ "Reading symbols from ${cache}/\[^\r\n\]+\\.\\.\\.(?:\r\nExpanding full symbols from \[^\r\n\]+)*"] \ "debuginfod running, info downloaded, no CRC mismatch" } with_debuginfod_env $cache { local_debuginfod } stop_debuginfod # Spare debug files may confuse testsuite runs in the future. remote_exec build "rm -f $debugfile"