使用剥离符号调用gdb中的不明确函数

使用剥离符号调用gdb中的不明确函数,gdb,Gdb,我正试图用 (gdb) call fun() 在第三方库libFoo中,我以编译的形式获得了剥离符号 (gdb) info function ^fun$ Non-debugging symbols: 0x00007ffff6d7e3b0 fun 问题是,加载了一个不相关的系统库libBar,其中也包含fun,这一次是一个变量,gdb更喜欢该符号而不是所需的符号。我怀疑这是因为这个命中是一个非剥离调试符号 (gdb) info var ^fun$ File ../bar/baz.c: 256

我正试图用

(gdb) call fun()
在第三方库
libFoo
中,我以编译的形式获得了剥离符号

(gdb) info function ^fun$
Non-debugging symbols:
0x00007ffff6d7e3b0  fun
问题是,加载了一个不相关的系统库
libBar
,其中也包含
fun
,这一次是一个变量,gdb更喜欢该符号而不是所需的符号。我怀疑这是因为这个命中是一个非剥离调试符号

(gdb) info var ^fun$
File ../bar/baz.c:
256:    static const int fun[18];

(gdb) info symbol fun
fun in section .rodata of libBar.so
它试图将变量作为函数调用有点疯狂,但这正是它试图做的

问题是,如何消除符号的歧义并指示gdb使用
libFoo
中的符号


到目前为止,我找到的唯一方法需要手动步骤(
info function^fun$
),然后调用(void)0x00007ffff6d7e3b0()。这不太好,因为它不允许我在不同的程序运行中编写调用脚本。

可能有更好的解决方案,但您可以尝试以下方法:
调用((void(*)0x00007ffff6d7e3b0)(
调用((void(*)0x00007FF6D7E3B0)(
并不比
(void)0x00007FF6D7E3B0()好。
。这两种方法都有效,但在这两种情况下,地址都是特定于程序运行的,不能用于设计用于任何运行的脚本中。但是您可能想说
调用((void(*)()fun)(
?不幸的是,这也试图调用错误的符号。