无法连结OBJ文件通过LLVM编译器使用MS链接器产生的(Failed to link obj fi

2019-10-16 14:40发布

我用网上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 ao我得到了错误

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

怎样才能正确OBJ文件送入LINK.EXE?


更多信息

  • 我内置LLVM使用Visual Studio 11,我没得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

Answer 1:

你是在一个陌生的地方,你可以读一遍: http://llvm.org/docs/GettingStartedVS.html这可以帮助



Answer 2:

你IR是X86-64 / Linux作为靶三联说明。 因此,有限责任公司将为您生成,不COFF(默认)ELF目标文件。 当然LINK.EXE是不会接受的。

需要注意的是,你不能只是改变目标三重一些窗口,并承担一切都将工作:

  1. COFF目标代码发射是WIP
  2. C / C ++不是目标无关的语言,因此,你不能获得与目标无关的IR位置: http://llvm.org/docs/FAQ.html#platformindependent


文章来源: Failed to link obj files generated by LLVM compiler using MS Linker
标签: llvm