首页 > 解决方案 > 为什么要为链接器指定目标架构?

问题描述

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

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

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

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

标签: clinkerembeddednewlib

解决方案


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

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

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


推荐阅读