Kompilieren und führen Sie das Programm ohne main() in C

Ich versuche zu kompilieren und führen Sie das folgende Programm ohne main() Funktion in C. Ich kompiliert habe mein Programm mit dem folgenden Befehl.

gcc -nostartfiles nomain.c

Und compiler gibt Warnung

/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 0000000000400340

Ok, Kein problem. dann habe ich ausführen ausführbare Datei (.out), beide printf Aussagen erfolgreich drucken, und dann bekommen "segmentation fault".

So, meine Frage ist, Warum segmentation fault nach der erfolgreichen Ausführung der print-Anweisung?

mein code:

#include <stdio.h>

void nomain()
{
        printf("Hello World...\n");
        printf("Successfully run without main...\n");
}

Ausgabe:

Hello World...
Successfully run without main...
Segmentation fault (core dumped)

Hinweis:

Hier -nostartfiles gcc-flag verhindert, dass der compiler mit standard-startup-Dateien als Verlinkung

Ich bin überrascht, dass dies überhaupt funktioniert. Ehrlich gesagt, halte ich diese Behandlung durch den linker werden fehlerhafte (oder zumindest eine Schlechte Sache): es wurde kein Eintrag-Punkt, so dass der linker nur halluzinierte er aus, was Funktion war sehr praktisch. Blech.
zumindest der linker war so freundlich genug, um die Aufmerksamkeit darauf lenken, mit einer Verwarnung und zu erklären, was Ausweichaktion war es! Du hast Recht, das könnte besser sein als ein Fehler, anstatt nur eine Warnung, obwohl.
Warum würden Sie verwenden keinen main?
Nicht übermäßig relevant zu einer Diskussion über UNIX-artigen Systemen, aber der Eintrag-Punkt für Windows-Programme ist nicht unbedingt main, aber WinMain oder wWinMain.
eigentlich sowohl auf Windows-und Linux-Sie können beliebigen Einstiegspunkt: für Linux ist ld es wäre -e option für den Windows-MSVC-linker, es wäre /ENTRY option.

InformationsquelleAutor msc | 2017-02-19

Schreibe einen Kommentar