【发布时间】:2020-05-14 05:21:31
【问题描述】:
在某些情况下,我正在检查一个使用实验性事务内存模型的简单 C++ 程序,该模型是用 g++ 编译的。我想知道 register_tm_clones 的确切调用位置(您可以通过 objdumping 一个简单的程序来查看 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 的位置?
【问题讨论】:
-
您的问题不清楚:您已经看到确切在哪里调用它。另外,
ld != ld-linux,请不要混淆,以免混淆大家。 -
抱歉,我应该更清楚我的要求。我的意思是我想确切地知道,从
_start到程序结束,在哪里调用了register_tm_clones。另外,我想我不熟悉ld和ld-linux之间的区别。你能向我解释一下区别,以便我可以编辑问题陈述吗?我已经更新了问题,使我要问的问题更清楚。