如何在动态打开的共享库进入时设置断点?

问题描述 投票:0回答:1

在某些情况下,我正在使用通过g ++编译的实验性事务存储模型来检查一个简单的C ++程序。我想确切地知道register_tm_clones的调用位置(可以通过转储一个简单的程序来查看fn)。即使在诸如int main() {}之类的程序中,也会调用此函数。

[我想知道在一般程序的整个范围中哪里调用了register_tm_clones

我在GDB中为其设置了一个断点,并回溯了:
Breakpoint 1, 0x00007ffff7c5e6e0 in register_tm_clones () from /usr/lib/libgcc_s.so.1
(gdb) bt
#0  0x00007ffff7c5e6e0 in register_tm_clones () from /usr/lib/libgcc_s.so.1
#1  0x00007ffff7fe209a in call_init.part () from /lib64/ld-linux-x86-64.so.2
#2  0x00007ffff7fe21a1 in _dl_init () from /lib64/ld-linux-x86-64.so.2
#3  0x00007ffff7fd313a in _dl_start_user () from /lib64/ld-linux-x86-64.so.2
#4  0x0000000000000001 in ?? ()
#5  0x00007fffffffe390 in ?? ()
#6  0x0000000000000000 in ?? ()

[libgcc在程序中的某个时刻打开ld-linux时调用。我确保我们与libgcc相关联。是的:

❯ ldd main
    linux-vdso.so.1 (0x00007fff985e4000)
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007f7eb82dc000)
    libm.so.6 => /usr/lib/libm.so.6 (0x00007f7eb8196000)
    libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007f7eb817c000)
    libc.so.6 => /usr/lib/libc.so.6 (0x00007f7eb7fb6000)
    /lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007f7eb84ec000)

但是...我怎么知道什么时候被调用(绝对不在main中?)?我知道_start是C ++程序的真实入口。然后运行__libc_csu_init,然后执行一些步骤,然后进入main。如何设置断点以在全景图中查看,以查看ld决定何时打开libgcc,并因此打开register_tm_clones的位置?

在某些情况下,我正在使用通过g ++编译的实验性事务存储模型来检查一个简单的C ++程序。我想确切地知道register_tm_clones的调用位置(您可以看到fn ...

c++ linux gdb ld
1个回答
1
投票

我如何设置断点以在全局视图中查看以查看ld决定何时打开libgcc,并因此在何处调用register_tm_clones?

© www.soinside.com 2019 - 2024. All rights reserved.