1

我使用 llvm 在线编译器来编译我的示例 C 代码,

int main() { return 0; }

生成的 LLVM 程序集,

 ; ModuleID = '/tmp/webcompile/_31588_0.bc'
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

define i32 @main() nounwind uwtable {
  %1 = alloca i32, align 4
  store i32 0, i32* %1
  ret i32 0
}

然后我将 LLVM 程序集编译为 obj 文件,

llc -filetype=obj a.ll

当我尝试使用链接 obj 文件时link.exe a.o出现错误

 fatal error LNK1107: invalid or corrupt file: cannot read at 0x438

如何生成正确的 obj 文件以输入 link.exe?


更多信息

  • 我使用 Visual Studio 11 构建了 LLVM。我没有安装 cygwin。
  • link.exe 也来自 Visual Studio 11
  • LLVM 是从最新的源代码构建的。

如果我使用 VC++ 编译器将相同的代码编译成程序集,它看起来像这样,

; Listing generated by Microsoft (R) Optimizing Compiler Version 17.00.50402.0 

include listing.inc

INCLUDELIB LIBCMT
INCLUDELIB OLDNAMES

PUBLIC  main
; Function compile flags: /Odtp
_TEXT   SEGMENT
main    PROC
; File c:\tmp\u.c
; Line 1
    xor eax, eax
    ret 0
main    ENDP
_TEXT   ENDS
END

llc -filetype=asm j.ll生成以下代码。它也因 ml.exe 而失败。

    .def     _main;
    .scl    2;
    .type   32;
    .endef
    .text
    .globl  _main
    .align  16, 0x90
_main:                                  # @main
# BB#0:
    pushl   %eax
    movl    $0, (%esp)
    xorl    %eax, %eax
    popl    %edx
    ret
4

2 回答 2

1

如目标三元组中所述,您的 IR 适用于 x86-64/linux。因此,llc 将为您生成(默认情况下)ELF 目标文件,而不是 COFF。当然 link.exe 不会接受它。

请注意,您不能只将目标三元组更改为某些窗口并假设一切正常:

  1. COFF 目标代码发射是 WIP
  2. C/C++ 不是独立于目标的语言,因此,您无法在此处获得独立于目标的 IR:http: //llvm.org/docs/FAQ.html#platformindependent
于 2012-04-10T07:50:19.310 回答
1

你在一个陌生的地方,你可以阅读: http: //llvm.org/docs/GettingStartedVS.html这可能会有所帮助

于 2012-04-10T03:20:40.563 回答