使用ld --verbose导出的默认链接脚本链接时报ldlang.c 4986错误如何解决
问题根因
你使用的GNU Binutils 2.30版本存在已知缺陷:ld --verbose默认输出的内容不是纯净的链接脚本,首尾包含了链接器版本、支持架构等额外说明文本,直接保存后通过-T参数指定使用时会触发内部错误。
正确操作步骤
- 第一步:提取纯净的默认链接脚本,过滤首尾无关内容:
ld --verbose | sed -n '/^=====*/,/^=====*/p' | sed '1d;$d' > amd64.ld
- 第二步:验证基础链接有效性,直接使用导出的纯净脚本链接你的目标文件,此时生成的ELF文件结构和不指定
-T参数时完全一致,不会再报内部错误:
# 示例:gcc调用时指定链接脚本 gcc -T amd64.ld test.o -o test
- 第三步:在验证通过的
amd64.ld中修改段定义,在.data段的相邻位置添加你需要的自定义段与PROVIDE指令即可。
注意事项
- 如果你直接调用ld而非通过gcc封装调用,需要手动指定crt启动文件、libc依赖等gcc默认添加的内容,否则会出现符号缺失的报错。
- 新增自定义段时注意保持和相邻段的权限(r/w/x)、对齐参数一致,避免运行时出现内存访问异常。
内容的提问来源于stack exchange,提问作者user2052153
相关产品推荐
相关产品推荐

