2016-08-02 9 views
0

How to specify Win32 as output when invoking GCC using MinGW on Windows.Windows上でMinGWを使用してGCCを呼び出すときに出力としてWin32を指定する方法

以下にソースコードを掲載しました。私の目的は、アセンブリとCコードをインターフェースし、実行可能ファイルを生成することです。

私は、次のNASMコマンドを使用して、Win32のにadd.asmを組み立てる開始:

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ファイルadd.oを使用して(

nasm -f elf add.asm 

にコマンドを使用してELFにこの時間をコンパイルする場合)

gcc -o add add.o call_asm.c 

作品p間違いなく

オブジェクトファイルがWin32形式であることをGCCに伝えるにはどうすればいいですか?その前に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をコンパイル+リンクしますが、いずれも問題にならないことを除いて)。おそらく、コンパイル/リンクを分割しようとし、シンボルが期待どおりの場合に.oファイルをobjdumpでチェックしてみてください。 (または他の誰かがここで問題を見つけることができます:) – Ped7g

+0

(Windows)PEオブジェクトファイルとリンクしようとする前に、ELFオブジェクトファイルを生成しているのはGCCでしょうか? – Shuzheng

+1

クロスコンパイラではなくmingw 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形式は誰か他の人の祖父によって設計されたものなので、少し違う規則があります。 "だから"。 –

関連する問題