2011-06-04 59 views
2

嘿,我想在我的程序中包装一个函数,而不使用LD_PRELOAD。Linux函数重定向

我有两个函数具有相同签名:

void someFunc() { 
    puts ("someFunc"); 
} 

void someFunc_wrapper() { 
    puts ("someFunc_wrapper"); 
} 

我想任何函数调用someFunc重定向一起包装函数的调用。 当然,我能做到这一点与定义宏或将包装函数到一个共享库,然后调用这样的程序:

LD_PRELOAD=./mylib.so my_program 

不过,我想重定向功能在运行时调用,无需修改程序呼叫。
据我所知,应该可以通过在运行时修改可执行文件的符号表来重定向这些调用。

任何帮助将不胜感激:)

回答

0

即使它是可行的,修改你的程序的符号表可能不足以在一般情况下 - 想想编译器内联你的函数。

虽然您可以通过使用间接函数调用(通常通过指向函数的指针调用该函数,当您要切换实现时更新该指针)而无需肮脏的技巧来做到这一点。

请注意,这有一些运行时间开销(一个更多的间接寻址)。这是否重要取决于用例。如果这只是您正在实施的调试功能,则可以在编译时使用宏技巧关闭它。

#include <stdio.h> 

void foo(void) { 
    printf("Hello from foo\n"); 
} 

void bar(void) { 
    printf("Hello from bar\n"); 
} 

#ifdef INTERCEPT 

typedef void(*myfunptr)(void); 

myfunptr thingy = foo; 

void turnonbar(void) 
{ 
    thingy = bar; 
} 

#else 
#define turnonbar() 
#define thingy foo 
#endif 

int main(void) { 
    thingy(); 
    turnonbar(); 
    thingy(); 
    return 0; 
} 
+0

感谢您的回答:) 是的,我可以使用函数指针,这将是最好的方式。 但我真的很想知道如何操作符号表来达到这个目的,因为在很多情况下,包装函数调用会非常有用,无需访问源代码并重新编译应用程序。 :) – TcShadowWalker 2011-06-04 18:21:27

2

ld有应该做你想要的选项--wrap=symbol。手册页有一个例子如何工作。

+0

好的信息。我不知道这一个。 – sehe 2011-06-04 22:33:36