linux ltrace(库跟踪工具)是如何工作的?

jjhzyzn0  于 2023-05-22  发布在  Linux
关注(0)|答案(1)|浏览(141)

ltrace是如何工作的?
它如何找出程序调用了哪些库函数?
是否有任何公共的代码路径,所有对库函数的调用都要经过?也许ltrace在这个公共代码路径中设置了断点?

piwo6bdm

piwo6bdm1#

动态可执行文件有一个符号表,链接器在解析需要连接到库函数的引用时使用该符号表。(您可以通过运行objdump -T /path/to/binary自己看到这一点)。
这个符号表也可以被其他工具访问--比如ltrace--所以确定哪些函数需要被挂钩并逐个遍历该列表是很简单的。
请参阅Ottowa Linux Symposium上的a talk on ltrace internals,它提供了详细的功能分解;要沿着源代码,请参阅official repositorythird-party github mirror
一些较新的发行版(比那次谈话更新)也挂接了dlopen()调用,以便能够跟踪动态加载库的调用。这里的机制应该是相当明显的--如果可以用shim替换dlopen()(当dlopen()本身如上所述动态链接时),那么就可以在它返回的任何函数指针上设置断点。

相关问题