C 为什么-export动态标志不适用于存档?

C 为什么-export动态标志不适用于存档?,c,linker,C,Linker,如果我编译并链接一个带有-export动态标志的可执行文件,它不适用于存储在链接的归档文件中的符号。此标志仅用于导出链接的对象(不在存档中)的符号。有人能解释一下为什么会这样吗?因为归档文件不导入或导出任何内容 “.A”文件只是“.o”文件的概要。在链接到可执行文件或共享库之前,没有导入和导出的概念。“ar”存档中没有数据结构来存储这样的东西。问题似乎是.a文件中的.o文件只有在可执行文件需要时才链接(显然,它被称为“死剥离”)。在我的例子中,只有使用dl命令显式打开的共享库才需要这些符号。我可

如果我编译并链接一个带有-export动态标志的可执行文件,它不适用于存储在链接的归档文件中的符号。此标志仅用于导出链接的对象(不在存档中)的符号。有人能解释一下为什么会这样吗?

因为归档文件不导入或导出任何内容


“.A”文件只是“.o”文件的概要。在链接到可执行文件或共享库之前,没有导入和导出的概念。“ar”存档中没有数据结构来存储这样的东西。

问题似乎是.a文件中的.o文件只有在可执行文件需要时才链接(显然,它被称为“死剥离”)。在我的例子中,只有使用dl命令显式打开的共享库才需要这些符号。我可以链接--whole archive选项(至少在GNU上),这将强制链接归档文件中的所有对象。

但是当我将可执行文件与归档文件链接在一起时,它可以提取归档文件中每个.o的所有符号,不是吗?或者,如果单独链接.o与.o的a.a,那么实际的可执行文件最终会有所不同吗?它可能会有所不同,除非您使用——整个归档,这是一项相对较新的发明。嵌套存档对我来说是新闻。我们构建过程的一部分是向存档中添加存档,但我认为这实际上是一个bug/疏忽。我们正在显式链接嵌套存档,因此我认为嵌套存档将被忽略为无法识别。请使用注释或编辑您的问题,而不是创建答案。为什么?我可以回答我自己的问题。事实上,它专门识别了这个用例。