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 

그리고 이들을 서로 연결하는 명령. 여기

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(); 
} 

나는이 오류가 이유 없음 생각입니다 :

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

나는 오류 메시지가 ? 감사합니다. .

UPDATE : 내가 가지고 16 @ _MessageBoxA 4와 메시지 박스 @ _ExitProcess에 ExitProcess를 변경하고 GCC와 연결하여 해결 내 문제.

답변

1

일반적으로 libgcc에 정의되어있는 gcc C 시작 루틴 __main (gcc로 컴파일 할 때 main에 의해 호출 됨)이 누락되었습니다. 그것을 얻는 가장 쉬운 방법은 ld가 아닌 gcc (링크 포함)와 링크하는 것입니다. 또는 링크 명령 행에 -lgcc을 추가하십시오.

+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 misc.o) :(. 텍스트 + 0x67) :'InitializeCriticalSection @ 4 '에 대한 정의되지 않은 참조 – Ian

+0

@ 이안, 당신은 다음 win32 또는 뭔가 링크를 추가해야합니다. '-lwin32'를 추가하십시오. 작동하지 않는다면 적어도 힌트가됩니다! 몇 가지 기본적인 Windows 라이브러리가 누락되었습니다. –