mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-15 20:08:23 +00:00
When running test-case gdb.base/break-probes.exp on ubuntu 18.04.5, we have: ... (gdb) run^M Starting program: break-probes^M Stopped due to shared library event (no libraries added or removed)^M (gdb) bt^M #0 0x00007ffff7dd6e12 in ?? () from /lib64/ld-linux-x86-64.so.2^M #1 0x00007ffff7dedf50 in ?? () from /lib64/ld-linux-x86-64.so.2^M #2 0x00007ffff7dd5128 in ?? () from /lib64/ld-linux-x86-64.so.2^M #3 0x00007ffff7dd4098 in ?? () from /lib64/ld-linux-x86-64.so.2^M #4 0x0000000000000001 in ?? ()^M #5 0x00007fffffffdaac in ?? ()^M #6 0x0000000000000000 in ?? ()^M (gdb) UNSUPPORTED: gdb.base/break-probes.exp: probes not present on this system ... Using the backtrace, the test-case tries to establish that we're stopped in dl_main, which is used as proof that we're using probes. However, the backtrace only shows an address, because: - the dynamic linker contains no minimal symbols and no debug info, and - gdb is build without --with-separate-debug-dir so it can't find the corresponding .debug file, which does contain the mimimal symbols and debug info. Fix this by instead printing the pc and grepping for the value in the info probes output: ... (gdb) p /x $pc^M $1 = 0x7ffff7dd6e12^M (gdb) info probes^M Type Provider Name Where Object ^M ... stap rtld init_start 0x00007ffff7dd6e12 /lib64/ld-linux-x86-64.so.2 ^M ... (gdb) ... Tested on x86_64-linux.
104 lines
2.7 KiB
Plaintext
104 lines
2.7 KiB
Plaintext
# 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 <http://www.gnu.org/licenses/>.
|
|
|
|
if { [skip_shlib_tests] } {
|
|
return 0
|
|
}
|
|
|
|
standard_testfile
|
|
|
|
set libname $testfile-solib
|
|
set srcfile_lib $srcdir/$subdir/$libname.c
|
|
set binfile_lib [standard_output_file $libname.so]
|
|
|
|
if { [gdb_compile_shlib $srcfile_lib $binfile_lib {}] != "" } {
|
|
untested "failed to compile shared library"
|
|
return -1
|
|
}
|
|
|
|
if { [prepare_for_testing "failed to prepare" $testfile $srcfile \
|
|
[list debug shlib_load additional_flags=-DSHLIB_NAME=\"$binfile_lib\"]] } {
|
|
return -1
|
|
}
|
|
|
|
# Enable stop-on-solib-events
|
|
gdb_test_no_output "set stop-on-solib-events 1"
|
|
|
|
# Start the inferior and run to the first stop
|
|
gdb_run_cmd
|
|
gdb_test "" ".*Stopped due to shared library event.*"
|
|
|
|
# Check if we're using probes.
|
|
set using_probes 0
|
|
|
|
# Get PC.
|
|
set pc ""
|
|
gdb_test_multiple "p /x \$pc" "" {
|
|
-re -wrap " = ($hex)" {
|
|
set pc $expect_out(1,string)
|
|
}
|
|
-re -wrap "" {
|
|
}
|
|
}
|
|
if { $pc == "" } {
|
|
unsupported "Couldn't get $pc"
|
|
return -1
|
|
}
|
|
regsub "0x0*" $pc "" pc
|
|
|
|
# Verify that pc is at info_start probe address.
|
|
gdb_test_multiple "info probes stap rtld" "" {
|
|
-re -wrap "init_start +0x0*$pc .*" {
|
|
set using_probes 1
|
|
}
|
|
-re -wrap "" {
|
|
}
|
|
}
|
|
|
|
if { ! $using_probes } {
|
|
unsupported "probes not present on this system"
|
|
return -1
|
|
}
|
|
|
|
set sysroot ""
|
|
set test "show sysroot"
|
|
gdb_test_multiple $test $test {
|
|
-re "The current system root is \"(.*)\"\..*${gdb_prompt} $" {
|
|
set sysroot $expect_out(1,string)
|
|
}
|
|
}
|
|
|
|
# GDB strips "target:" from the start of filenames
|
|
# when operating on the local filesystem
|
|
regsub "^target:" "$sysroot" "(target:)?" sysroot
|
|
|
|
# Run til it loads our library
|
|
set test "run til our library loads"
|
|
set not_loaded_library 1
|
|
while { $not_loaded_library } {
|
|
set not_loaded_library 0
|
|
gdb_test_multiple "c" $test {
|
|
-re "Inferior loaded $sysroot$binfile_lib\\M.*$gdb_prompt $" {
|
|
pass $test
|
|
}
|
|
-re "Stopped due to shared library event\\M.*$gdb_prompt $" {
|
|
set not_loaded_library 1
|
|
}
|
|
}
|
|
}
|
|
|
|
# Call something to ensure that relocation occurred
|
|
gdb_test "call (int) foo(23)" "\\\$.* = 31.*\\\M.*"
|