追踪是怎么工作的?
它是如何发现程序调用库函数的?
是否有所有对库函数的调用都经过的公共代码路径?也许ltrace在这个公共代码路径中设置了断点?
谢谢!
发布于 2015-08-25 21:29:17
动态可执行文件具有链接器在解析需要连接到库函数的引用时使用的符号表。(通过运行objdump -T /path/to/binary,您可以自己看到这一点)。
这个符号表也可以被其他工具访问--比如ltrace --所以确定哪些函数需要连接并单独遍历列表是非常简单的。
请参阅在渥太华Linux专题讨论会上介绍的a talk on ltrace internals,该研讨会提供了详细的、按功能细分的功能;要遵循源代码,请参阅official repository或third-party github mirror。
一些较新的版本(最近的版本)也会挂起dlopen()调用,以便能够跟踪动态加载库的调用。这里的机制在思考时应该是相当明显的--如果一个人可以用一个垫片代替dlopen() (当dlopen()本身像上面那样被动态链接时),那么我们就可以在它返回的任何函数指针上设置一个断点。
https://stackoverflow.com/questions/32214079
复制相似问题