关于LLVM的.ll、.bc、.s文件的疑问:.ll是否具备机器无关性?
LLVM IR相关问题解答
.ll文件的机器无关性本质
LLVM IR(.ll格式)本身设计目标就是机器无关,与.bc二进制字节码完全等价——前者是人类可读的文本形式,后者是二进制序列化形式,二者都属于LLVM的平台中立中间表示,可直接被LLVM解释器、JIT编译器处理。
你的.ll文件出现x86_64引用的原因
你通过clang -S -save-temps *.c生成的.ll文件带有x86_64相关内容,是因为该命令默认会针对当前宿主架构(你的机器为x86_64)注入目标架构特定的元数据/属性,但这些并非LLVM IR核心逻辑的一部分,核心指令集仍然保持机器无关性。
生成纯机器无关可读LLVM IR的方法
要得到完全脱离目标架构绑定的.ll文件,需明确让clang生成纯LLVM IR,避免过早引入架构相关信息:
- 方式一:先生成.bc文件再转成.ll
clang -emit-llvm -c *.c -o file.bc llvm-dis-14 file.bc -o file.ll - 方式二:直接生成机器无关的.ll文件
clang -emit-llvm -S *.c -o file.ll
上述命令生成的.ll文件不会包含x86_64这类架构特定引用,完全符合机器无关要求,可直接用于解释器执行或JIT编译。
关于.s文件无x86_64引用的疑问
你提到的.s文件仅显示clang版本信息,是因为clang -S默认生成目标架构的汇编代码,但如果编译的代码无实质可执行逻辑(比如空文件),汇编器只会生成包含版本注释的空文件。当编译有实际逻辑的代码时,.s文件会包含x86_64的具体汇编指令,这才是真正的机器相关代码。
内容的提问来源于stack exchange,提问作者Andrew K
相关产品推荐
相关产品推荐

