2016-12-08 1 views
2

J'essaie d'appeler une fonction d'assemblage assemblé avec MSNA d'une simple classe de pilote C compilé avec GCC MinGW.Assemblée interfacer des C

J'utilise les commandes suivantes pour compiler et assembler les fichiers.

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

gcc -c driver.c -o driver.o 

et la commande suivante pour les lier ensemble.

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

Je reçois le message d'erreur:

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

Voici mon exemple d'assemblage et le code 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(); 
} 

Toute pensée pourquoi je pourrais obtenir cette erreur ? Merci.

MISE À JOUR: j'ai eu mon problème résolu en changeant ExitProcess à _ExitProcess @ 4 et MessageBox à _MessageBoxA @ 16 et la liaison avec gcc.

Répondre

1

Il vous manque la routine de démarrage gcc C __main (appelée par main lorsque vous compilez avec gcc), qui est généralement définie dans libgcc. Le moyen le plus simple de l'obtenir est de lier avec gcc (qui l'inclut) plutôt qu'avec ld. Alternativement, ajouter -lgcc à la ligne de commande de liaison.

+0

J'ai essayé gcc et a obtenu un autre ensemble d'erreurs: c:/MinGW/bin /../ lib/gcc/mingw32/4.9.3 /../../../ libmingw32.a (tlsthrd.o .) :(texte + 0x218): undefined reference to 'InitializeCriticalSection @ 4' c:/MinGW/bin /../ lib/gcc/mingw32/4.9.3 /../../../ libmingwex.a (. misc.o) :(texte + 0x67): undefined reference to 'InitializeCriticalSection @ 4' – Ian

+0

@Ian, vous devez alors ajouter un lien vers win32 ou quelque chose. Essayez d'ajouter '-lwin32'. Si ça ne marche pas, c'est au moins un indice! Il vous manque une bibliothèque Windows fondamentale. –