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.
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.