c - 为什么要为链接器指定目标架构?
问题描述
我一直致力于将 Meson 构建系统用于嵌入式项目。由于我在嵌入式平台上工作,因此我编写了一个自定义链接器脚本以及对链接器的调用。直到我尝试链接newlib
到我的项目,当我开始遇到链接问题时,我才遇到任何问题。就在我让它工作之前,最后一个错误是 undefined reference to main
我清楚地知道在项目中。
出于偶然,我尝试添加-mcpu=cortex-m4
到我的链接器调用(我gcc
用来链接,我被告知这是非常典型的而不是直接调用ld
)。有效!现在,我唯一的问题是“为什么”?
也许我错过了有关链接过程实际工作方式的一些信息,但考虑到我只是生成一个 ELF 文件,我认为为链接器指定 CPU 架构并不重要。这是一newlib
件事,还是gcc
只是在幕后为我做了我以前从未见过的魔术?
供参考,这是我的项目(不完整)
解决方案
通常,您应该始终通过编译器驱动程序(命令的链接形式gcc
)进行链接,而不是通过直接调用ld
. 如果您正在为特定目标上的裸机进行开发,则可以确定您需要并ld
直接使用的链接器参数集,但是编译器驱动程序会为您处理很多事情,通常最好让它. (如果你没有一个固定的目标,那么就有无限的可能性组合,而且你不可能重现所有人可能关心的所有现在和未来的目标。)
您仍然可以通过-Wl,...
选项表单将您喜欢的任何选项传递给链接器,例如自定义链接器脚本。
至于为什么特定的目标体系结构 ISA 级别可能对链接很重要,链接并不是将二进制块粘在一起的愚蠢过程。链接可能涉及修补(重定位)甚至生成(远程跳转目标的 thunk 等)代码,在这种情况下,链接器可能需要关心它所针对的特定 ISA 级别/变体。
推荐阅读
- java - 无循环打印 Arraylist
- c# - 访问窗口大小 xaml DataTemplate WPF
- lua - Redis:原子获取和条件集
- java - systemuid异常中的相同jobid
- c# - ASP.NET MVC Update-Database 命令实体验证在尝试插入带分数的十进制数时失败
- django - 使用 Django 搜索 PostgreSQL 并传递一个 null 或空字符串值
- linux - 无法为 CONFIG_UNDWINDER_ORC=y 生成 ORC 元数据
- ios - 在 swift 中仅使用范围键查询 AWS DynamoDB 服务器
- java - 用java将数据写入mysql
- javascript - 如何获取位于表格单元格中的按钮路径