0

我一直致力于将 Meson 构建系统用于嵌入式项目。由于我在嵌入式平台上工作,因此我编写了一个自定义链接器脚本以及对链接器的调用。直到我尝试链接newlib到我的项目,当我开始遇到链接问题时,我才遇到任何问题。就在我让它工作之前,最后一个错误是 undefined reference to main我清楚地知道在项目中。

出于偶然,我尝试添加-mcpu=cortex-m4到我的链接器调用(我gcc用来链接,我被告知这是非常典型的而不是直接调用ld)。有效!现在,我唯一的问题是“为什么”?

也许我错过了有关链接过程实际工作方式的一些信息,但考虑到我只是生成一个 ELF 文件,我认为为链接器指定 CPU 架构并不重要。这是一newlib件事,还是gcc只是在幕后为我做了我以前从未见过的魔术?

供参考,这是我的项目(不完整)

4

2 回答 2

0

通常,您应该始终通过编译器驱动程序(命令的链接形式gcc)进行链接,而不是通过直接调用ld. 如果您正在为特定目标上的裸机进行开发,则可以确定您需要并ld直接使用的链接器参数集,但是编译器驱动程序会为您处理很多事情,通常最好让它. (如果你没有一个固定的目标,那么就有无限的可能性组合,而且你不可能重现所有人可能关心的所有现在和未来的目标。)

您仍然可以通过-Wl,...选项表单将您喜欢的任何选项传递给链接器,例如自定义链接器脚本。

至于为什么特定的目标体系结构 ISA 级别可能对链接很重要,链接并不是将二进制块粘在一起的愚蠢过程。链接可能涉及修补(重定位)甚至生成(远程跳转目标的 thunk 等)代码,在这种情况下,链接器可能需要关心它所针对的特定 ISA 级别/变体。

于 2019-10-12T19:18:38.530 回答
0

此类链接器选项可确保在默认而不是显式指定或覆盖时链接适当的标准库和启动代码。

一个 ARM 工具链支持多种ARM 架构变体和选项;它们可能是大端或小端,具有各种指令集 - ARM、Thumb。Thumb-2、ARM64 等,以及各种扩展,如 SIMD 或 DSP 单元。链接器需要体系结构信息来选择要链接的正确库,以实现性能和二进制兼容性。

于 2019-10-13T11:05:15.097 回答