澄清一下,我的问题是指当调用者和被调用者与 GCC 编译器和链接器在同一个编译单元中定义时,包装/拦截从一个函数/符号到另一个函数/符号的调用。
我的情况类似于以下情况:
/* foo.c */
void foo(void)
{
/* ... some stuff */
bar();
}
void bar(void)
{
/* ... some other stuff */
}
我想包装对这些函数的调用,我可以用ld 的--wrap
选项(在一定程度上)做到这一点(然后我实现 __wrap_foo 和 __wrap_bar ,它们依次调用 __real_foo 和 __real_bar ,正如 ld--wrap
选项的结果所期望的那样)。
gcc -Wl,--wrap=foo -Wl,--wrap=bar ...
我遇到的问题是,这只对来自此编译单元外部的 foo 和 bar 的引用生效(并在链接时解决)。也就是说,从foo.c中的其他函数调用 foo 和 bar不会被包装。
我尝试使用objcopy --redefine-sym,但这只会重命名符号及其引用。
在我将 *.o 文件传递给链接器选项之前,我想将调用foo
和bar
(在 foo.o 中)替换为__wrap_foo
和__wrap_bar
(就像它们在其他目标文件中通过链接器选项解析一样) ,而无需修改 foo .c 的源代码。--wrap
--wrap
这样,所有对foo
and的调用都会发生包装/拦截bar
,而不仅仅是发生在 foo.o 之外的调用。
这可能吗?