2017-08-31 113 views
1

我正在使用llc来使用命令行将.ll文件转换为.s。然后我想取这个文件,然后用nasm来创建一个可执行文件。虽然第一步似乎工作正常,但我无法完成第二步工作。如何从LLVM ir创建可执行文件?


原始文件被称为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

生成的代码是AT&T语法,NASM不会理解它。您必须使用GNU汇编程序('as')来汇编该'.s'文件或任何能够理解AT&T语法的汇编程序。 –

+0

@Michael Petch好的,虽然我无法测试它atm它肯定听起来像这是我所需要的。你愿意写一个答案,以便我可以接受它。如果你没有足够的时间,我会在几天内写出自己的答案,这几乎只是重申一下你的答案,简要说明AT&T语法和NASM使用的语法。谢谢 – SleepingPanda

+0

当你认为你已经解决它时,请成为我的客人并自己回答。 –

回答

-1

感谢@Michael Petch@Ross Ridge的意见,我终于明白了为什么这不起作用,并找到了一个可行的选择。


问题

有各种不同的汇编语言的,它在语法变化,并且不直接兼容的原因。由于nasm需要另一个汇编语言,而llc正在生成,所以它显然不起作用,这就解释了一长串错误。

怎么做,而不是

考虑到llc有AT &牛逼汇编作为输出,这是为GNU toolchain创建的,最明显的一步是使用GCC建设code.s文件,之后创建可执行文件llc

要安装GCC我下载MinGW,安装了它,并呼吁

的MinGW得到安装GCC

现在我可以访问GCC可用于创建code.exe通过调用

gcc code.s -o code.exe

gcc [filename] -o [name of the created executable]


由于这种解决方案可能复杂得多,它需要我会很高兴地看到一些替代/改进。

+1

如果你有'llvm'你不是已经有'clang'吗?这将为您节省添加YATC(另一个工具链)。 –

+0

弗兰克是对的。 'clang'已经有了一个内置的汇编程序,或者可以使用binutils中的'as'。如果你已经有'clang',你不需要gcc来建立'.s'文件。 –

+0

@Frank C.据我所知,我没有铛/我需要下载它。但只要我以这种方式工作,我不想花费大量时间学习如何以另一种方式来做,即使我的方式更复杂 – SleepingPanda