【发布时间】:2020-02-16 00:58:12
【问题描述】:
我有一个使用 gcc 和 -ffunction-sections 选项编译的目标文件。我可以访问源文件,但不允许修改它。
file.c
void foo(void)
{
bar();
}
void bar(void)
{
abc();
}
我想要实现的是让所有对 bar 的引用都采用绝对地址(我将在链接器脚本中分配),而 bar 将被链接器放置在其他地址。
一种可能的解决方案是将 bar 重命名为 file_bar,而不更改 foo() 中对 bar 的调用。我尝试使用 objcopy -redefine-syms 但它似乎甚至重命名了对 bar 的调用。
busybee 提供的解决方案可以解决问题,除非函数在同一个编译单元中。 foo1.c
#include <stdio.h>
extern void bar1();
void foo1(){
printf("foo1\n");
}
int main(){
printf("main\n");
foo1();
bar1();
}
bar1.c
#include <stdio.h>
void bar1(){
printf("bar1\n");
}
包装器.c
#include <stdio.h>
void __wrap_foo1(){
printf("wrap_foo1\n");
}
void __wrap_bar1(){
printf("wrap_bar1\n");
}
现在,
$ gcc -c -ffunction-sections foo1.c bar1.c wrapper.c
$ gcc -Wl,--wrap=foo1 -Wl,--wrap=bar1 -o output foo1.o bar1.o wrapper.o
$ ./output
main
foo1
wrap_bar1
【问题讨论】:
-
如果您将函数
bar重命名为file_bar而不更改对其的调用和引用,那么链接应该会失败,因为要链接的源中不会有原始bar,对?并且新函数file_bar可以是唯一的符号名称,因此重命名的函数将未被使用并且可能被删除。你为什么想这么做?这是XY问题吗?实际上你想替换bar函数内容而不改变其他任何东西?