2012-04-09 15 views
0

我用LLVM在線編譯器來編譯我的樣品C代碼生成,無法連結OBJ文件通過LLVM編譯器使用MS接頭

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 

,當我試圖連接使用link.exe a.o我得到了ERR OBJ文件或

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 
+1

我將認爲ASM不是Linux和Windows之間兼容,這是什麼相同的程序看起來像如果編譯與VS 11的編譯器在彙編? – 2012-04-09 22:21:49

+0

@GradyPlayer似乎由llvm和VC生成的程序集有很大不同。我如何強制llvm編譯器生成VC兼容代碼? – woodings 2012-04-09 22:31:38

+0

@woodings:寫一個轉換工具將目標文件轉換爲COFF或相應地修改LLVM源文件?或者只需按照格雷迪答案中鏈接的頁面上的說明操作。 – 0xC0000022L 2012-04-10 03:24:45

回答

1

你IR是X86-64/Linux作爲靶三聯說明。所以,llc會爲你生成(默認)ELF對象文件,而不是COFF。當然link.exe不會接受它。

請注意,你不能只是改變目標三重一些窗口,並承擔一切都將工作:

  1. COFF目標代碼發射是WIP
  2. C/C++不是目標無關的語言,因此,你無法獲得此目標無關IR:http://llvm.org/docs/FAQ.html#platformindependent