如何在Windows上使用MinGW调用GCC时将Win32指定为输出

时间:2016-08-02 09:25:10

标签: c windows gcc assembly mingw

  

如何在Windows上使用MinGW调用GCC时将Win32指定为输出。

下面我发布了我的源代码。我的目标是使用C代码连接程序集并生成可执行文件。

我开始使用以下NASM命令将add.asm组装到Win32:

nasm -f win32 add.asm

那么应该可以使用C和目标文件调用GCC吗?

gcc -o add add.obj call_asm.c

但是,这会导致链接错误:

C:\Users\nze\AppData\Local\Temp\cckUvRyC.o:call_asm.c:(.text+0x1e): undefined reference to `add'
collect2.exe: error: ld returned 1 exit status

如果我使用

编译为ELF
nasm -f elf add.asm

命令(这次使用ELF文件add.o)

gcc -o add add.o call_asm.c

完美无缺。

如何判断GCC我的目标文件是否为Win32格式,以便在链接之前将call_asm.c编译为Win32? (我想这是问题的核心,请评论我是否正确)。

call_add.c:

#include <stdio.h>

extern int add(int a, int b);

int main()
{
  printf("%d", add(7, 6));
}

add.asm:

    BITS 32
    global _add

_add:
    push ebp
    mov ebp, esp

    mov eax, [ebp+8]
    mov ebx, [ebp+12]
    add eax, ebx

    mov esp, ebp
    pop ebp
    ret

2 个答案:

答案 0 :(得分:4)

问题不在于你的假设。 GCC正在产生&#34; win32&#34;格式(通常称为PECOFF)对象文件。问题是您的汇编代码没有定义一个部分,这导致NASM没有在生成的目标文件中定义符号_add

如果您添加SECTION指令,您的代码会链接并运行而不会出现错误:

    BITS 32

    SECTION .text
    global _add

_add:
    push ebp
    mov ebp, esp

    mov eax, [ebp+8]
    mov ebx, [ebp+12]
    add eax, ebx

    mov esp, ebp
    pop ebp
    ret

告诉NASM生成和ELF目标文件因任何原因改变其行为,并使其在ELF目标文件中定义_add符号。

答案 1 :(得分:0)

只需在标签之前添加它:

.globl  _add

要使该符号导出到.DLL中,您应该在文件末尾添加该符号:

.section .drectve
.ascii " -export:\"add\""

请注意,开头的下划线被忽略了。