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