我用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
我將認爲ASM不是Linux和Windows之間兼容,這是什麼相同的程序看起來像如果編譯與VS 11的編譯器在彙編? – 2012-04-09 22:21:49
@GradyPlayer似乎由llvm和VC生成的程序集有很大不同。我如何強制llvm編譯器生成VC兼容代碼? – woodings 2012-04-09 22:31:38
@woodings:寫一個轉換工具將目標文件轉換爲COFF或相應地修改LLVM源文件?或者只需按照格雷迪答案中鏈接的頁面上的說明操作。 – 0xC0000022L 2012-04-10 03:24:45