与C接口组件

时间:2016-12-08 22:35:15

标签: c gcc assembly nasm

我试图用一个用MinGW GCC编译的简单C驱动程序类调用与NASM组装的汇编函数。

我使用以下命令编译和汇编文件。

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

有没有想过为什么我会收到这个错误? 感谢。

更新 我通过将ExitProcess更改为_ExitProcess @ 4并将MessageBox更改为_MessageBoxA @ 16并使用gcc进行链接来解决问题。

1 个答案:

答案 0 :(得分:1)

您错过了gcc C启动例程__main(使用gcc编译时由main调用),这通常在libgcc中定义。获得它的最简单方法是链接gcc(包括它)而不是ld。或者,将-lgcc添加到链接命令行。

相关问题