【发布时间】:2016-08-27 22:24:09
【问题描述】:
我正在编写一个裸机应用程序,遇到了一个我认为与链接器有关的问题。
问题:
IRQ 处理程序未从提供的静态库链接。 IRQ 在库外部声明为__attribute__ ((weak, alias("defaultInterrupt")))。提供此属性时,IRQ 未链接。当属性被删除时,IRQ 被链接。
这篇帖子:Linking with static library not equivalent to linking with its objects 表明问题可能在于链接器没有找到强声明,因为它停止搜索,但不建议修复。
问题:
有什么方法可以确保链接器能够找到强声明的函数?
环境:
我使用的是 ARM 分发的 arm-none-eabi-ld,在这里可以找到:arm-none-eabi
已经尝试过:
重新排序传递给链接器的库
【问题讨论】:
-
链接的问题确实提供了解决方案。也许您错过了它,所以如果您还没有尝试过,那么值得一试:“这是通过用 --whole-archive 和 --no-whole-archive 链接器标志包围静态库来解决的”。
-
@kaylum,感谢您的回复。如果我错了,请纠正我,但这将包括整个图书馆。由于这是一个裸机应用程序,我的闪存空间有限,包含整个库不是一个可行的选择。
-
您可以从静态库中提取该目标文件(使用
ar x)并将其显式包含在链接器命令行中 - 我认为这将强制链接器包含它。或者,您可以显式引用该目标文件中定义的其他符号。你有静态库的源代码吗?
标签: c gcc linker static-libraries ld