我目前正在使用llc使用命令行将.ll
文件转换为.s
。然后我想获取此文件,然后使用nasm从中创建可执行文件。虽然第一步似乎工作正常,但我无法完成第二步。
原始文件名为code.ll
,包含以下代码:
define i32 @main() {
ret i32 0
}
现在我使用cmd通过输入以下内容来构建.s
文件:
llc code.ll
这样可以正常工作并创建一个包含以下代码的code.s
文件:
.def @feat.00;
.scl 3;
.type 0;
.endef
.globl @feat.00
@feat.00 = 1
.def _main;
.scl 2;
.type 32;
.endef
.text
.globl _main
.align 16, 0x90
_main: # @main
# BB#0:
xorl %eax, %eax
ret
现在我想使用此代码创建一个可执行文件,llc doc告诉我这个代码:
然后可以通过本机汇编器和链接器传递汇编语言输出,以生成本机可执行文件。
所以我输入nasm(我应该按照我的理解做我想做的事),输入:
nasm code.s
产生以下错误列表:
code.s:1: error: attempt to define a local label before any non-local labels
code.s:1: error: parser: instruction expected
code.s:2: error: attempt to define a local label before any non-local labels
code.s:2: error: parser: instruction expected
code.s:3: error: attempt to define a local label before any non-local labels
code.s:3: error: parser: instruction expected
code.s:4: error: attempt to define a local label before any non-local labels
code.s:5: error: attempt to define a local label before any non-local labels
code.s:5: error: parser: instruction expected
code.s:6: error: parser: instruction expected
code.s:7: error: parser: instruction expected
code.s:8: error: parser: instruction expected
code.s:9: error: parser: instruction expected
code.s:12: error: parser: instruction expected
code.s:13: error: parser: instruction expected
code.s:14: error: parser: instruction expected
BB#0::1: error: parser: instruction expected
BB#0::2: error: parser: instruction expected
BB#0::3: error: parser: instruction expected
BB#0::4: error: parser: instruction expected
BB#0::5: error: parser: instruction expected
BB#0::8: error: parser: instruction expected
BB#0::9: error: parser: instruction expected
BB#0::10: error: parser: instruction expected
由于我对LLVM或汇编程序的经验接近于零,我自己无法解决这个问题。
如果我遗漏了一些重要信息,请告诉我,我会尽快编辑我的答案。
答案 0 :(得分:-1)
感谢@Michael Petch和@Ross Ridge的评论,我终于明白了为什么这不起作用并找到了可行的替代方案。
有不同种类的汇编语言,它们的语法不同,并且不直接兼容。由于nasm期待的是另一种汇编语言而不是llc正在产生,它显然不起作用,这解释了很长的错误列表。
考虑到llc将AT& T汇编程序作为输出(为GNU toolchain创建),最明显的步骤是在构建{GCC后创建可执行文件{1}}文件llc。
mingw-get install gcc
现在我可以通过调用
来访问GCC,这可用于创建code.s
gcc code.s -o code.exe
code.exe
由于这个解决方案可能比它需要的更复杂,我很乐意看到一些替代/改进。