1

我正在为 LD 编写一个链接器脚本来收集所有 .init_array 部分,以便调用固件中声明的所有全局对象的构造函数。

除非我在静态库中有一个未引用的全局对象,否则一切正常。在这种情况下,尽管我使用了如下的 KEEP 宏,但没有明确引用该对象,它在最终的二进制文件中被丢弃。(无论我是否使用 -gc-sections )。

如果相同的未引用对象被放置在静态库之外,从而被链接描述文件的通用行捕获,它确实会被包含在内。

.init_array :
{
   _init_array_start = .;
   KEEP (*core*:*(SORT(.init_array*)))
   KEEP (*core*:*(.init_array))
   KEEP (*(SORT(.init_array.*)))
   KEEP (*(.init_array))
   PROVIDE (_init_array_end = .);
} > flash

该库名为 libcore.a。在 libcore.a 中明确引用的其他对象也被包括在内。

任何有关如何解决此问题的帮助将不胜感激。

提前致谢

4

1 回答 1

1

静态库实际上是一个ar包含多个.o文件和一个索引的存档。.o该索引用于根据主程序引用的符号来确定要链接的文件。因此,如果没有引用文件中的符号.o链接器甚至不会加载有问题的.o文件,因此链接器脚本永远不会得到它。

假设您使用的是 GNU LD,您可以使用ld'-r标志将多个.o文件组合成一个libcore.o文件,并将其用作.o存档中的唯一文件。这样做的缺点是您可能会引入不必要的代码,否则这些代码会通过跳过.o文件而被忽略。或者,您还可以使用静态构造函数.o将存档中所有其他文件的虚拟引用添加到文件中。.o

于 2012-10-13T10:06:48.550 回答