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,兼容新版目标文件格式,示例编译命令:
该方法不需要改动现有GNAT安装,对现有开发环境影响最小。gnatmake hello.adb -largs -B/usr/bin/ - 长期方案:升级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
相关产品推荐
相关产品推荐

