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
如果我改为使用
编译为 ELFnasm -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/