如何在链接器脚本(.ld文件)的SECTIONS区块中引入子脚本?报错“malformed number: dwarf.ld”排查
首先明确:你的用法是完全符合GNU ld文档规范的——INCLUDE指令确实可以放在SECTIONS区块内部,甚至是单个输出段的定义里。你遇到的malformed number: dwarf.ld报错,本质是ld在解析脚本时出现了语法误解,下面是具体的排查方向:
1. 主脚本中INCLUDE前的语法未正确闭合
ld对SECTIONS区块内的语法格式要求非常严格,如果INCLUDE dwarf.ld前的代码存在语法不完整(比如某个段的{}没闭合、少了分号),ld会把INCLUDE指令错误地当成前一段定义的一部分,从而抛出“格式错误的数字”这类莫名其妙的报错。
举个典型的错误场景:
.bar { *(.bar) // 这里漏掉了闭合的 } INCLUDE dwarf.ld
这种情况下,ld会认为INCLUDE dwarf.ld是.bar段内的内容,自然无法正确解析。
解决办法:仔细检查主链接器脚本第198行(报错行)的前几行代码,确保所有的括号、分号都正确闭合,语法完全完整。
2. 被引入的dwarf.ld文件本身存在语法错误
如果dwarf.ld内部有语法问题(比如段定义格式错误、出现非法标识符、关键字拼写错误),ld在解析这个引入的文件时,会把错误定位到INCLUDE指令的位置,就表现为你看到的报错。
比如dwarf.ld里如果有这样的错误代码:
.dwarf_info { *(.dwarf_info) invalid123 // 这里是无意义的非法内容 }
就会导致ld解析失败,并把锅甩给INCLUDE指令。
解决办法:
- 单独验证dwarf.ld的语法:用
ld -T dwarf.ld --verbose命令测试该文件是否能被正常解析,直接定位内部的语法错误 - 确保dwarf.ld里的所有段定义都符合ld的规范,比如每个段的
{}配对、必要的关键字都正确
3. 文件路径的特殊字符干扰(可能性较低)
如果dwarf.ld的路径包含空格、特殊符号(比如&、$),ld可能会误解析路径内容,触发奇怪的错误。不过这种情况通常会先报“找不到文件”,但也不排除特殊场景下的解析异常。
解决办法:使用绝对路径或者不含特殊字符的相对路径指定dwarf.ld,确保ld能正确找到并读取文件。
快速验证用法正确性
你可以先做一个最小化测试来确认INCLUDE在SECTIONS内的用法没问题:
- 创建一个
test.ld,内容只有:
.test_section { *(.test) }
- 在主脚本的SECTIONS区块内引入它:
SECTIONS { .foo { ... } .bar { ... } INCLUDE test.ld }
如果这个测试能正常通过,说明你的用法完全没问题,问题就出在dwarf.ld本身或者主脚本中INCLUDE前的语法疏漏上。
内容的提问来源于stack exchange,提问作者ArmadilloChubbz65

