移植GCC编译项目:Clang如何兼容大写L开头的全局标签?
解决Clang不接受大写L开头全局汇编标签的问题
Clang的集成汇编器(LLVM MC)默认将大写L开头的符号视为局部标签,因此声明这类符号为全局时会抛出"non-local symbol required in directive"错误。以下是无需大量修改源代码的解决方案:
调用系统GNU汇编器(GAS)编译
编译汇编文件时添加-fno-integrated-as选项,让Clang放弃使用自身的集成汇编器,转而调用系统中的GAS(和原GCC编译环境一致)。这种方式完全兼容原有汇编代码,无需修改任何源码。
示例编译命令:clang -c -fno-integrated-as your_assembly_file.s -o your_assembly_file.o通过汇编器选项全局化指定符号
如果不想依赖GAS,可在编译时通过-Xassembler传递选项,逐个将大写L开头的符号标记为全局。例如:clang -c -Xassembler --globalize-symbol=LabelStartingWithCapitalL your_assembly_file.s -o your_assembly_file.o若符号数量较多,可编写脚本扫描汇编文件中的
.global声明行,自动生成对应的编译选项,避免手动重复操作。最小化修改汇编代码(可选)
若允许极小幅度修改源码,可在标签定义前用.type明确指定符号类型,辅助Clang识别其全局属性:.globl LabelStartingWithCapitalL .type LabelStartingWithCapitalL, @object LabelStartingWithCapitalL: .4byte ...注:
@object可根据符号实际类型替换为@function。
内容的提问来源于stack exchange,提问作者Dennis
相关产品推荐
相关产品推荐

