【问题标题】:GNU ld: weak declaration overriding strong declarationGNU ld:弱声明覆盖强声明
【发布时间】: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


【解决方案1】:

似乎很久以前在一个并不遥远的星系中提出了类似的问题:Override weak symbols in static library

tl;dr; 带走的是weak 属性并不像人们期望的那样适用于静态存档库。链接器在第一次遇到目标符号名称时停止搜索。 author of the accepted answer 解释说 weak 可能只对共享对象有意义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-03
    • 2014-08-19
    • 2018-06-28
    • 1970-01-01
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多