在某些情况下,我正在使用通过g ++编译的实验性事务存储模型来检查一个简单的C ++程序。我想确切地知道register_tm_clones
的调用位置(可以通过转储一个简单的程序来查看fn)。即使在诸如int main() {}
之类的程序中,也会调用此函数。
[我想知道在一般程序的整个范围中哪里调用了register_tm_clones
。
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 ...
我如何设置断点以在全局视图中查看以查看ld决定何时打开libgcc,并因此在何处调用register_tm_clones?