gnu 链接器不在共享库中包含未引用的模块

gnu linker doesn't include unreferenced modules in a shared library

我有一个共享库,它由很多 .c 模块组成,其中一些模块本身是从其他静态 .a 库链接到共享库的。其中大部分在图书馆内部被引用,但有些不是。我发现链接器不将这些模块包含在共享库中,除非从共享库中至少调用了模块中的函数。我一直在通过在我知道将包含的模块中的虚拟 ForceLinkages() 函数中添加调用来解决这个问题。

没关系,但令人惊讶,因为我正在使用 .version 文件为该库定义 public API。我本以为在 .version 文件中包含那些未引用的 .c 模块中的函数将构成对模块的引用并强制将它们包含在库中。

这个库最初是在 AIX 上开发的,它使用 .exp 文件来定义 public API。而且,我从来没有遇到未包含未引用模块的问题。即,引用 .exp 文件中的模块足以让链接器将它们拉入。有没有办法让 linux 链接器像那样工作。如果没有,我可以继续使用我愚蠢的 ForceLinkages() 函数来完成工作...

That's okay, but it's surprising, since I'm using a .version file to define a public API to this library.

.version 文件(假设它是一个链接器版本脚本)没有定义 库API。如果仅确定哪些函数是 从库中导出的 以及哪些函数是隐藏的。

I would've thought including functions in those unreferenced .c modules in the .version file would constitute a reference to the modules and force them to be included in the library.

应用版本脚本链接器决定哪些对象将成为库的一部分,哪些将被丢弃,并且对较早做出的决定。

这一切都按设计工作。

您需要要么使用 --whole-archive --no-whole-archive(这有链接到您不需要的代码并使您的二进制文件膨胀的危险),要么像您之前所做的那样继续添加引用.