MSリンカを使用してLLVMコンパイラによって生成されたファイルは、objが、私は私のサンプルCコードをコンパイルするためにLLVMオンラインコンパイラを使用
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ファイルに組み立て、私はERRを得たlink.exe a.o
を使用してOBJファイルをリンクしようとした
llc -filetype=obj a.ll
または
fatal error LNK1107: invalid or corrupt file: cannot read at 0x438
正しいobjファイルをlink.exeに挿入するにはどうすればよいですか?
-
詳しい情報は、私はcygwinのインストールされていなかったのVisual Studio 11を使用してLLVMを構築しました。
- 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コンパイラでasmにコンパイルされた場合のように見えますか? –
@GradyPlayerは、llvmとVCによって生成されたアセンブリはかなり異なっているようです。 llvmコンパイラにVC互換のコードを生成させるにはどうすればいいですか? – woodings
@woodings:オブジェクトファイルをCOFFに変換する変換ツールを書くか、それに応じてLLVMソースを変更しますか?または単にGradyの答えにリンクされているページの指示に従ってください。 – 0xC0000022L