lnc*_*ncr 7 windows assembly nasm llvm llvm-ir
我目前正在使用llc将.ll
文件转换为.s
使用命令行的文件。然后我想获取这个文件,然后使用nasm从它创建一个可执行文件。虽然第一步似乎工作正常,但我无法让第二步工作。
原始文件被调用code.ll
并包含以下代码:
define i32 @main() {
ret i32 0
}
Run Code Online (Sandbox Code Playgroud)
现在我使用 cmd.s
通过键入以下内容来构建文件:
有限责任公司代码.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
Run Code Online (Sandbox Code Playgroud)
现在我想使用这段代码创建一个可执行文件,关于它的llc 文档告诉我:
然后,汇编语言输出可以通过本机汇编器和链接器来生成本机可执行文件。
因此,我 通过键入以下内容使用nasm(据我所知,它应该可以满足我的要求):
nasm 代码.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
Run Code Online (Sandbox Code Playgroud)
由于我在 LLVM 或汇编器方面的经验接近于零,我无法自己解决这个问题。
如果我遗漏了一些重要的东西,请告诉我,我会尽快编辑我的答案。
感谢@Michael Petch和@Ross Ridge的评论,我终于明白了为什么这不起作用并找到了一个可行的替代方案。
汇编语言有多种,其语法各不相同,并且不直接兼容。由于nasm期望使用llc生成的另一种汇编语言,因此它显然不起作用,这解释了一长串错误。
考虑到llc具有 AT&T 汇编器作为输出,该汇编器是为GNU 工具链创建的,最明显的步骤是在使用llc构建文件后使用GCC创建可执行文件。code.s
mingw-get 安装 gcc
现在我可以访问GCC,它可以code.exe
通过调用来创建
gcc代码.s -o代码.exe
gcc [filename] -o [name of the created executable]
由于这个解决方案可能比需要的更复杂,我很高兴看到一些替代方案/改进。