You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Fedora 36使用2021社区版GNAT出现链接错误如何解决?

问题描述

具备多年Ada开发经验的用户,在Fedora 36系统中使用2021社区版GNAT编译入门级"hello world"程序时,在链接阶段触发错误,完整报错信息如下:

/opt/GNAT/2021/bin/../libexec/gcc/x86_64-pc-linux-gnu/10.3.1/ld:
.gnu.build.attributes has both ordered
[.gnu.build.attributes.lo.exit in /lib/../lib64/crt1.o] and unordered
[.gnu.build.attributes in /lib/../lib64/crt1.o] sections
/opt/GNAT/2021/bin/../libexec/gcc/x86_64-pc-linux-gnu/10.3.1/ld:
final link failed: bad value collect2: error: ld returned 1 exit status
故障原因

该错误是版本兼容问题导致:2021版GNAT捆绑的ld链接器版本过低,无法识别Fedora 36及更新版本系统中glibc提供的crt1.o目标文件内的.gnu.build.attributes段格式。新版系统的crt1.o中同时存在有序、无序两种格式的同名属性段,旧版ld无法处理这种混合结构,直接终止链接流程抛出错误。

可行解决方案
  • 优先方案:编译时指定使用系统自带的新版ld链接器
    编译时通过-largs给链接阶段传参,用-B参数指定系统工具路径,让编译链优先调用系统版本的ld,兼容新版目标文件格式,示例编译命令:
    gnatmake hello.adb -largs -B/usr/bin/
    
    该方法不需要改动现有GNAT安装,对现有开发环境影响最小。
  • 长期方案:升级GNAT到2022及更新的社区版本
    2022及之后版本的GNAT已经内置了新版binutils工具链(包含ld链接器),可以原生兼容Fedora 36及更新发行版的glibc文件格式,升级后无需额外添加编译参数即可正常编译链接程序。
  • 临时方案:添加链接参数跳过属性段检查(仅适合临时验证场景)
    编译时传参让ld忽略.gnu.build.attributes段的格式冲突,快速完成编译,示例命令:
    gnatmake hello.adb -largs -Wl,--no-build-notes
    
    注意:该方法仅屏蔽报错,未解决版本不兼容的本质问题,生成的程序可能存在隐性运行异常,不建议在正式开发场景使用。

内容的提问来源于stack exchange,提问作者Dick Gayler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 05:39:40