# Copyright 2012-2021 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 . # Test the "print symbol-loading" option. if {[skip_shlib_tests]} { return 0 } standard_testfile print-symbol-loading-main.c set libfile print-symbol-loading-lib set srcfile_lib ${libfile}.c set binfile_lib [standard_output_file ${libfile}.so] set gcorefile ${binfile}.gcore set objfile [standard_output_file ${testfile}.o] if { [gdb_compile_shlib ${srcdir}/${subdir}/${srcfile_lib} ${binfile_lib} {debug}] != "" || [gdb_compile ${srcdir}/${subdir}/${srcfile} ${objfile} object {debug}] != "" } { untested "failed to compile" return -1 } set opts [list debug shlib=${binfile_lib}] if { [gdb_compile ${objfile} ${binfile} executable $opts] != "" } { untested "failed to compile" return -1 } clean_restart ${binfile} gdb_load_shlib ${binfile_lib} if ![runto lib] { return -1 } if {![gdb_gcore_cmd $gcorefile "save a corefile"]} { return -1 } proc test_load_core { print_symbol_loading } { global binfile binfile_lib gcorefile srcdir subdir with_test_prefix "core ${print_symbol_loading}" { gdb_exit gdb_start gdb_reinitialize_dir $srcdir/$subdir gdb_test_no_output "set print symbol-loading $print_symbol_loading" if { ${print_symbol_loading} != "off" } { gdb_test "file $binfile" "Reading symbols from.*" "file" } else { gdb_test_no_output "file $binfile" "file" } # Rename the shared lib so gdb can't find it. remote_exec host "mv -f ${binfile_lib} ${binfile_lib}.save" gdb_test "core ${gcorefile}" "Core was generated by .*" \ "re-load generated corefile" # Now put it back and use "set solib-search-path" to trigger # loading of symbols. remote_exec host "mv -f ${binfile_lib}.save ${binfile_lib}" set test_name "load shared-lib" switch "${print_symbol_loading}" { "off" { gdb_test_no_output "set solib-search-path [file dirname ${binfile_lib}]" \ ${test_name} } "brief" { gdb_test "set solib-search-path [file dirname ${binfile_lib}]" \ "Loading symbols for shared libraries\\." \ ${test_name} } "full" { gdb_test "set solib-search-path [file dirname ${binfile_lib}]" \ "Reading symbols from.*" \ ${test_name} } } gdb_test "frame" "#0 \[^\r\n\]* lib .*" "library got loaded" } } test_load_core off test_load_core brief test_load_core full # Now test the sharedlibrary command. proc test_load_shlib { print_symbol_loading } { global binfile global gdb_prompt with_test_prefix "shlib ${print_symbol_loading}" { clean_restart ${binfile} gdb_test_no_output "set auto-solib-add off" if ![runto_main] { return -1 } gdb_test_no_output "set print symbol-loading $print_symbol_loading" set test_name "load shared-lib" switch ${print_symbol_loading} { "off" { set cmd "sharedlibrary .*" set cmd_regex [string_to_regexp $cmd] gdb_test_multiple $cmd $test_name { -re "^$cmd_regex\r\n$gdb_prompt $" { pass $test_name } -re "^$cmd_regex\r\nSymbols already loaded for\[^\r\n\]*\\/libc\\.\[^\r\n\]*\r\n$gdb_prompt $" { pass $test_name } } } "brief" { gdb_test "sharedlibrary .*" \ "Loading symbols for shared libraries: \\.\\*.*?(?:Symbols already loaded for .*?libc)?" \ ${test_name} } "full" { gdb_test "sharedlibrary .*" \ "Reading symbols from.*" \ ${test_name} } } gdb_breakpoint "lib" gdb_continue_to_breakpoint "lib" gdb_test "frame" "#0 \[^\r\n\]* lib .*" "library got loaded" } } test_load_shlib off test_load_shlib brief test_load_shlib full