如何在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
如果我使用
编译为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));
}
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
答案 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\""
请注意,开头的下划线被忽略了。