gpt4 book ai didi

c - 如何使gcc链接静态库中的强符号覆盖弱符号?

转载 作者:太空狗 更新时间:2023-10-29 23:14:55 28 4
gpt4 key购买 nike

我的问题可以概括为以下几点:

bar.c:

#include <stdio.h>

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

ma​​in.c:

#include <stdio.h>

void __attribute__((weak)) bar() {
printf("foo\n");
}

int main() {
bar();
return 0;
}

生成文件:

all:
gcc -c bar.c
ar -rc libbar.a bar.o
gcc main.c -L. -lbar

输出:

$ ./a.out
foo

因此,由于 bar.c 链接到静态库 libbar.a 中的 main.c,因此 main.c 中的弱符号 bar 不会被 bar.c 中的强符号覆盖。

我如何告诉 gcc 使 libbar.a 中的强符号覆盖 main.c 中的弱符号?

最佳答案

我对 max.haredoom 给出的答案感到困惑(并且它被接受了)。答案涉及共享库和动态链接,而问题显然是关于使用静态库的静态链接的行为。我认为这是一种误导。

当链接静态库时,ld 关心弱/强符号默认情况下:它只是将 undefined symbol 解析为第一个-遇到符号(所以命令行中静态库的顺序很重要)。

但是,可以使用 --whole-archive 选项更改此默认行为。如果您按如下方式重写 Makefile 中的最后一步:

gcc main.c -L. -Wl,--whole-archive -lbar -Wl,--no-whole-archive

然后你会看到:

$ ./a.out
bar

简而言之,--whole-archive 强制链接器扫描其所有符号(包括那些已解析的符号)。如果强符号已被弱符号解决(如我们的情况),则强符号将否决弱符号。

另请参阅有关静态库及其链接过程的精彩帖子 "Library order in static linking" by Eli Benderskythis SO question .

关于c - 如何使gcc链接静态库中的强符号覆盖弱符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31374901/

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