是否可以将调用包装到静态链接的第三方库?

时间:2010-06-16 13:08:57

标签: c linux linker

我想跟踪来自其他第三方库的第三方库的调用。

示例:我想跟踪对库A的调用。我的应用程序静态链接库B,库B又静态链接到库A.所以基本上我所拥有的是libAB.a

在动态链接的情况下,我可以编写库A2,包含我想跟踪库A的函数的包装器,并使用LD_PRELOAD = A2.so。然后,我的包装将被调用,我将看到跟踪。 在我的情况下,我不能使用动态链接。

是否可以使用静态链接实现相同的目标?

在理想情况下,我想将我的应用程序与libAB.a和跟踪库libA2.a链接起来并获取跟踪。

谢谢,
罗布斯塔

3 个答案:

答案 0 :(得分:2)

好的,我找到了它:)

man ld

       --wrap symbol
       Use a wrapper function for symbol.  Any undefined reference to symbol will be resolved to "__wrap_symbol".  Any undefined ref‐
       erence to "__real_symbol" will be resolved to symbol.

       This  can  be  used to provide a wrapper for a system function.  The wrapper function should be called "__wrap_symbol".  If it
       wishes to call the system function, it should call "__real_symbol".

       Here is a trivial example:

               void *
               __wrap_malloc (size_t c)
               {
                 printf ("malloc called with %zu\n", c);
                 return __real_malloc (c);
               }

       If you link other code with this file using --wrap malloc, then all calls to "malloc" will call the  function  "__wrap_malloc"
       instead.  The call to "__real_malloc" in "__wrap_malloc" will call the real "malloc" function.

答案 1 :(得分:0)

根据性能的重要性,您可以使用gdb ...(在您关心的所有函数上设置断点并记录堆栈跟踪......但这涉及学习如何编写gdb脚本)

还有Oprofile http://oprofile.sourceforge.net/,LTTng http://lttng.org/和perf(内核源代码中的最新内核,你需要编译它的工具/ perf /,在Ubuntu上,我认为它在linux-tools包)

我不能告诉你如何用这些工具实现你想要的东西,但oprofile和LTTng有很多文档和活跃的用户社区。

答案 2 :(得分:0)

好吧,这似乎是一个死锁:)

但我认为你可以用宏来解决它。虽然此解决方案可能不干净,但可能无法适用于所有情况。

你可以试试这个:

void functionFromLibA();
#define functionFromLibA() trace(); functionFromLibA()
int main()
{
    functionFromLibA();
}

这将扩展为:

void myfunc();
int main()
{
trace(); functionFromLibA();
}

编辑:但请注意,对于此解决方案,应在定义宏之前完成函数原型的所有声明。否则,您将在预处理中扩展原型。