2016-07-31 21 views
0

Why does entry point of _start results in error when linking with GCC on Windows/MinGW?在Windows/MinGW上與GCC鏈接時,爲什麼_start的入口點會導致錯誤?

使用下面的.asm文件I彙編和鏈接使用Windows 10以下命令使用MinGW的:

nasm -f win32 helloworld.asm 
gcc -e_start -o helloworld helloworld.obj 

組裝工作就好了,但聯產生以下錯誤:

c:/dev/mingw/bin/../lib/gcc/mingw32/4.9.3/../../../libmingw32.a(main.o):(.text.startup+0xa0): undefined reference to `[email protected]' 

_start更改爲_main一切似乎都很好。這是爲什麼?

BITS 32 

    global _start 
    extern _printf 

    section .text 
_start: 
    push msg 
    call _printf 
    add esp, 4 
    ret 
msg: 
    db "HelloWorld", 10, 0 
+0

你可以顯示你的源代碼嗎? –

+0

源代碼已在問題中。這是你看到的.asm代碼。 – Shuzheng

+1

那你爲什麼要把它標記爲C++? –

回答

2

因爲你gcc鏈接,而不是連接ld。 Gcc是許多編譯器和預處理器以及彙編器和鏈接器的封裝。 IE瀏覽器。它有助於使許多事情自動化。

像例如鏈接目標文件與默認的C啓動代碼,沒有明確要求它。

init啓動代碼已經有_start標籤,初始化stdlib C環境後,它會調用main

因此,如果您與stdlib鏈接,則必須提供main,如果將-nodefaultlibs作爲鏈接選項,則它只會將明確指定的.o文件鏈接在一起。那麼你的_start是唯一定義的。

+0

爲什麼GCC也抱怨它看到兩個_start標籤? – Shuzheng

+0

@NicolasLykkeIversen 我不確定,嘗試添加全局的'main:'(只是空的存根)保留'_start',看看輸出是如何來的。我認爲兩個_start可能只會產生鏈接警告與* some *二進制結果(而不是錯誤)。如果有多個.o重新定義相同的符號,我認爲第一個文件會勝出,但我只是猜測,我總是隻修復了我的鏈接,並且從不真正困擾重新定義會發生什麼。 – Ped7g

+0

謝謝,優秀的回答:-) – Shuzheng

相關問題