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

标签 c windows gcc assembly mingw

How to specify Win32 as output when invoking GCC using MinGW on Windows.

下面我发布了我的源代码。我的目标是将汇编与 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));
}

添加.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

最佳答案

问题并不像您想象的那样。 GCC 正在生成“win32”格式(通常称为 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 符号。

关于c - 在 Windows 上使用 MinGW 调用 GCC 时如何将 Win32 指定为输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38716570/

相关文章:

c++ - Boost signals2 自动连接管理和改变信号的互斥类型

c - 使用cmpxchg时,c内联程序集出现“操作数大小不匹配”

c - 查看数字是否小于 2^32

c++ - Visual C++ 2012 可再发行版是否向后兼容 2010 版?

c++ - C++ 编译器何时会为方法推断出 noexcept?

c++ - 如何在 Windows 中将 C/C++ 控制台文本设置为粗体和斜体?

c# menuItem1 不会禁用

c++ - 如何在核心转储中检查堆大小和创建的对象

C 将字符转换为字符*

c++ - 在 Visual Studio 2005 中编译 Win32 "hello world"的命令行