2009-10-25 74 views
2

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

我使用的是Fedora 11 64位版本。

谢谢。

回答

0

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

+0

通过阅读mysql客户端库的源代码,它看起来像是调用connect()等。 – 2009-10-25 18:52:07

2

看起来好像它不是由静态链接引起的。事实上,PHP是动态链接到其他库。这个问题依赖于PHP加载扩展的方式。

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

0

我同意上面的答案,这些库可能会绕过libc中open(),write()等的调用。换句话说,这些库可能直接使用assembly调用系统调用,而不是使用libc接口..尽管直接看到使用系统调用的应用程序并不常见,但它并不是闻所未闻的.. 如果是这样的话,那就是为什么你在库插入实验中看不到任何拦截。两种方法以后,快速通过一个Strace和更复杂的一个建立一个内核模块,将在内核级拦截这些调用到任何框架您正在建设情况的报告..
玩得开心.. ErnestoB