ltrace 是如何工作的?
它是如何找出程序调用库函数的?
是否有任何对库函数的所有调用都通过的通用代码路径?也许 ltrace 正在这个公共代码路径中设置断点?
谢谢!
动态可执行文件具有链接器在解析需要连接到库函数的引用时使用的符号表。(您可以通过运行自己查看objdump -T /path/to/binary
)。
这个符号表也可以被其他工具访问——例如ltrace
——也可以,因此确定哪些函数需要挂钩并单独遍历该列表是微不足道的。
请参阅Ottowa Linux Symposium上关于 ltrace 内部的演讲,该演讲提供了详细的功能分解;要跟随源代码,请参阅官方存储库或第三方 github 镜像。
一些较新的版本(比那次谈话更新)也挂钩dlopen()
调用,以便也能够跟踪动态加载的库的调用。稍微考虑一下,那里的机制应该是相当明显的——如果可以dlopen()
用 shim 替换(当dlopen()
它本身像上面那样动态链接时),那么可以在它返回的任何函数指针上设置断点。