2

我正在编写一个插入库来跟踪 libc 中某些库函数的使用情况,例如 open()、close()、connect() 等。它通常在大多数应用程序上运行良好。但是,当我使用 PHP 进行尝试时,特别是使用 PHP 的 MySQL 模块时,没有跟踪该模块内对 libc 的任何函数调用(因此没有 connect()、没有 socket() 等)。'strace' 告诉我系统调用了 socket()、connect() 等。在模块和libmysqlclient.so.16.0.0上运行'file'表示它们都是动态链接的。所以这应该不是静态链接引起的问题。可能是什么问题?

我正在使用 Fedora 11 64 位版本。

谢谢你。

4

3 回答 3

2

似乎它不是由静态链接引起的。事实上,PHP 是动态链接到其他库的。问题在于 PHP 加载扩展的方式。

PHP 通过调用带有 RTLD_LAZY 标志的 dlopen() 来加载扩展,这意味着只有在执行引用时才会解析符号。这绕过了 LD_PRELOAD 指定的插入。

于 2009-10-27T02:32:52.447 回答
0

库可能出于某种原因直接调用系统调用。在这种情况下,您需要使用strace(或ptrace()在您自己的程序中)来跟踪此使用情况。

于 2009-10-25T18:35:39.037 回答
0

我同意上面的答案,即这些库可能会绕过 libc 中对 open()、write() 等的调用。换句话说,这些库可能会直接使用程序集调用系统调用,而不是使用 libc 接口。 . 虽然看到应用程序直接使用系统调用并不是很常见,但它并非闻所未闻.. 如果是这种情况,这就是为什么你在库插入实验中看不到任何拦截的原因.. 你有两种方法,快速通过 strace 构建一个内核模块,该模块将在内核级别拦截这些调用并向您正在构建的任何框架报告..
玩得开心.. ErnestoB

于 2010-05-17T20:28:21.777 回答