2016-08-02 75 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格式是由別人的祖父設計的,所以它的規則略有不同。 「因爲」。 –