gpt4 book ai didi

c - 手动指定特定链接符号的重新映射

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:42:37 25 4
gpt4 key购买 nike

有没有办法在不修改这两个源文件的情况下,获取编译它们产生的目标文件,并说服链接器将 main_v1.c 中的 foo 链接到 bar 在 bar.c 中?

ma​​in_v1.c

void foo(void);

int main(void)
{
foo();
}

bar.c

#include <stdio.h>

void bar(void)
{
puts("bar()!");
}

修改目标文件本身是公平的游戏,但假设我们甚至可能没有可用的源代码。平台为 Linux。


通过坚持对 main_v1.c 进行适度的更改,并链接到一个额外的“映射”目标文件,这是一种仅使用标准 C 就几乎可以获得所需结果的方法。

ma​​in_v2.c

extern void (*const foo)(void);

int main(void)
{
foo();
}

bar.c 没有变化。

ma​​p.c

void bar(void);
void (*const foo)(void) = bar;

如果目标文件是用 lto 编译的,函数指针解引用甚至被省略(使用最近的 gcc)。这是一个很好的结果,但是如果 main() 被修改为直接调用 bar(),那么 bar() 本身就是链接后内联,因此还有改进的余地。

最佳答案

这将是 GNU ld--wrap option 的工作

我们假设,您有一个 main_v1.o 已编译并且可能无法从您的main_v1.c 以及从您的 bar.c 编译而来的 bar.o

现在编写另一个源文件:

wrap.c

extern void bar(void);

void __wrap_foo(void)
{
bar();
}

将其编译为wrap.o 并将其与之前的目标文件链接,如下所示:

$ gcc -c wrap.c
$ gcc -o prog -Wl,--wrap=foo main_v1.o bar.o wrap.o

然后:

$ ./prog
bar()!

关于c - 手动指定特定链接符号的重新映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41072504/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com