为了澄清,我的问题是关于使用GCC编译器和链接器时,在同一编译单元中定义调用者和被调用者的情况下,对一个函数/符号的调用进行包装/拦截的问题。
我有一个类似以下情况的情况:
我想包装对这些函数的调用,我可以使用ld的
我遇到的问题是,这仅在来自此编译单元之外(并在链接时解决)对 foo 和 bar 的引用产生影响。也就是说,在 foo.c 中的其他函数中调用 foo 和 bar 不会被包装。
在将*.o文件传递给链接器的
这样,包装/拦截就会发生在对
这可能吗?
我有一个类似以下情况的情况:
/* 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 不会被包装。
在将*.o文件传递给链接器的
--wrap
选项之前,我想将对foo
和bar
(在foo.o内部)的调用替换为__wrap_foo
和__wrap_bar
(就像链接器的--wrap
选项在其他对象文件中解析它们一样),而不必修改foo.c的源代码。这样,包装/拦截就会发生在对
foo
和bar
的所有调用上,而不仅仅是在foo.o之外的调用上。这可能吗?
objcopy --weaken-symbol=called_function
并链接一个定义了called_function()
的新目标文件。 - Vegard