2016-08-02 31 views
0

How to specify Win32 as output when invoking GCC using MinGW on Windows.如何在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 

如果我代替使用

nasm -f elf add.asm 

命令使用ELF文件add.o编译为ELF(此时)

gcc -o add add.o call_asm.c 

作品p erfectly。

我该如何告诉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

我没有看到这个问题,它看起来像你在这里做例子(例如:)):https://www.hackthissite.org/articles/read/1079 ...(除了你在源代码中做“_”前缀的东西,而不是在命令行中,并且你在相同的步骤中编译+链接.c,但这些都不是问题)。也许尝试拆分编译/链接,并检查objdump .o文件,如果符号符合预期? (或者其他人可以在这里发现问题:)) – Ped7g

+0

在尝试链接(Windows)PE目标文件之前,它可能是GCC生成ELF目标文件的吗? – Shuzheng

+1

你确定你有gingw gcc,而不是交叉编译器吗?我的意思是,也许你安装了一个运行在Windows上的gcc,但编译为Linux。这是一些人想要的东西,所以我并不感到惊讶。这不仅仅是你想要的。运行'gcc -v'来查看你的gcc是如何配置的。 –

回答

4

的问题是不是你认为它是什么。 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目标文件改变其行为,无论出于何种原因,并导致它来定义_add符号ELF对象文件。

+0

谢谢!全局符号是否应该始终位于某个区域内,或者只要定义了.text区域,它们就可以站在外面? – Shuzheng

+0

为什么它可以与ELF一起使用? – Shuzheng

+3

@Nicolas - 'text'部分应该包含可执行代码。因为有人的祖父决定。 ELF格式是由别人的祖父设计的,所以它的规则略有不同。 “因为”。 –

相关问题