2016-12-08 3 views
2

私は、MinGW GCCでコンパイルされたシンプルなCドライバクラスから、NASMでアセンブルされたアセンブリ関数を呼び出そうとしています。Assembly with C

次のコマンドを使用してファイルをコンパイルおよびアセンブルしています。

nasm -f win32 asm_main.asm -o asm.o 

gcc -c driver.c -o driver.o 

これらをリンクするには、次のコマンドを使用します。

ld.exe asm.o driver.o -L"C:\Windows\SysWOW64" -lkernel32 -luser32 -o app.exe 

私は、エラーメッセージが出ます:ここで

driver.o:driver.c:(.text+0x7): undefined reference to `__main' 

は私のサンプルアセンブリおよびCコード

; asm.asm 
extern _MessageBoxA, _ExitProcess 

section .data 
    title db "Greeting", 0 
    message db "Hello World!", 0 
section .bss 

section .text 
    global _asm_main 

_asm_main: 
    enter 0, 0 

    push dword 0 
    push dword title 
    push dword message 
    push dword 0 
    call _MessageBoxA 

    push dword 0 
    call _ExitProcess 

    mov eax, 0 
    leave 
    ret 

// driver.c 
extern int asm_main(); 


void main() 
{ 
    asm_main(); 
} 

いずれかが、私はこのエラーを取得する可能性がある理由と思っています?おかげさまで

UPDATE: 私は16 @ _MessageBoxAに4とメッセージボックス@ _ExitProcessへのExitProcessを変更してgccでリンクすることによって解決し、私の問題を得ました。

答えて

1

通常、libgccで定義されているgcc Cスタートアップルーチン(gccでコンパイルするとmainが呼び出されます)がありません。取得する最も簡単な方法は、ldではなくgcc(それを含む)にリンクすることです。または、リンクコマンドラインにを追加します。

+0

私はgccを試してみましたが、c:/ mingw/bin /../ lib/gcc/mingw32/4.9.3 /../../../ libmingw32.a(tlsthrd.o ):(。テキスト+ 0x218): 'InitializeCriticalSection @ 4 'への未定義参照c:/ mingw/bin /../ lib/gcc/mingw32/4.9.3 /../../../ libmingwex.a )。(テキスト+ 0x67):未定義の 'InitializeCriticalSection @ 4 'への参照 – Ian

+0

@Ian、あなたはwin32などへのリンクを追加する必要があります。 '-lwin32'を追加してみてください。それがうまくいかない場合は、少なくともヒントです!いくつかの基本的なWindowsライブラリがありません。 –