使用静态库进行弱链接

5

我在一个.c文件中使用了GCC弱属性声明了一个外部函数:

extern int weakFunction( ) __attribute__ ((weak));

编译后的目标文件将weakFunction定义为弱符号。 nm命令输出:
1791:         w weakFunction

我将调用如下定义不明确的函数:

```

if (weakFunction != NULL)
{
    weakFunction();
}

当我将目标文件定义为GCC的参数来链接程序时(gcc main.o weakf.o -o main.exe),弱符号能够正常工作。如果我不链接weakf.o,那么在main.c中该函数的地址就会是NULL,并且该函数将无法被调用。
问题在于,当weakf.o位于静态库中时,由于某种原因,连接器找不到该函数,该函数的地址始终为NULL。 静态库是通过ar创建的:ar rcs weaklibrary weakf.o 有人遇到过类似的问题吗?
1个回答

4
尽管我不知道弱符号的确切工作原理,但看起来你得到了你想要的:如果没有其他人强制存在weakFunction(),那么main()也不会强制存在。对我来说这很有道理:如果你尝试编写既可以与X设施一起使用又可以在没有它的情况下工作的代码,那么你不希望你的代码不惜一切代价强制包含X在你的构建中。看起来,“弱”是指询问是否存在某个东西,而不是请求出现某个东西。 也许你可以在链接器选项中使用“-u weakFunction”来强制包含弱符号。

谢谢,这些信息很有帮助。目前我会使用--whole-archive参数,直到我找到更好的方法来强制链接符号。-u参数不起作用 :(。 - Jaakko L.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接