2016-07-31 6 views
0

Why does entry point of _start results in error when linking with GCC on Windows/MinGW?Warum führt der Einstiegspunkt von _start beim Verbinden mit GCC unter Windows/MinGW zu einem Fehler?

Unter Verwendung der folgenden .asm Datei, die ich zusammenbauen und Link die folgenden Befehle unter Windows 10 unter Verwendung von MinGW mit:

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

Montage funktioniert gut, aber Verknüpfung erzeugt den folgenden Fehler:

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

Ändern _start zu _main alles scheint gut zu funktionieren. Warum das?

BITS 32 

    global _start 
    extern _printf 

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

Können Sie Ihren Quellcode anzeigen? –

+0

Der Quellcode ist bereits in der Frage. Es ist der .asm-Code, den Sie sehen. – Shuzheng

+1

Warum haben Sie es dann C++ markiert? –

Antwort

2

Weil Sie mit gcc verknüpfen, nicht der Linker ld. Gcc ist Wrapper für viele Compiler und Präprozessoren und Assembler und Linker. Ie. Es hilft, viele Dinge zu automatisieren.

Zum Beispiel Verknüpfung von Objektdateien mit Standard-C-Startup-Code, ohne explizit danach zu fragen.

Der Init-Startup-Code hat bereits _start Label, und nach dem Initialisieren von StdLib C-Umgebung wird es main aufrufen.

Wenn Sie also mit stdlib verknüpfen, müssen Sie main angeben, wenn Sie -nodefaultlibs als Verknüpfungsoption angeben, werden nur die explizit angegebenen .o Dateien verknüpft. Dann ist Ihre _start die einzige definiert.

+0

Warum beschwert sich GCC auch nicht, dass es zwei _start-Etiketten sieht? – Shuzheng

+0

@NicolasLykkeIversen Ich bin mir nicht sicher, versuchen Sie, globale 'main:' (nur leere Stub) ein Keep '_start' auch, um zu sehen, wie die Ausgabe kommen wird. Ich denke, dass zwei _start nur eine Verknüpfungswarnung mit * irgendeinem * binären Ergebnis erzeugen kann (kein Fehler). Im Falle der Mehrfachdefinition des gleichen Symbols, denke ich, dass die erste Datei gewinnt, aber ich rate nur, ich habe immer nur meine Verknüpfung korrigiert und nie wirklich gestört, was mit Neudefinitionen passiert. – Ped7g

+0

Danke, ausgezeichnete Antwort :-) – Shuzheng

Verwandte Themen