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

How does ltrace (library tracing tool) work?

ltrace 是如何工作的?

它是如何找到程序调用库函数的?

所有对库函数的调用是否有共同的代码路径?也许 ltrace 正在这个公共代码路径中设置断点?

谢谢!

Dynamic executables 有一个符号 table 供链接器在解析需要连接到库函数的引用时使用。 (这个你自己看运行 objdump -T /path/to/binary)。

此符号 table 也可由其他工具访问 - 例如 ltrace - 因此确定哪些函数需要挂钩并单独遍历该列表是微不足道的。

参见 a talk on ltrace internals presented at the Ottowa Linux Symposium, which provides a detailed, function-by-function breakdown; to follow along the source, see the official repository, or a third-party github mirror

一些较新的版本(比那个谈话更新)也挂钩 dlopen() 调用,以便能够跟踪动态加载库的调用。那里的机制应该很明显——如果可以用垫片替换 dlopen() (当 dlopen() 本身如上所述动态链接时),然后可以在任何函数指针上设置断点它 returns.