Kompilieren ohne libc
Frage
Ich möchte meinen C-Code ohne die (g) libc kompilieren. Wie kann ich es deaktivieren und welche Funktionen hängen davon ab?
Ich habe versucht -nostdlib aber es hilft nicht. Der Code ist übersetzbar und läuft, aber ich kann immer noch den Namen des libc in der hexdump meiner ausführbaren finden
Lösung
Wenn Sie Ihren Code mit -nostdlib
kompilieren, werden Sie nicht in der Lage sein, alle C-Bibliotheksfunktionen aufrufen (natürlich), aber Sie auch nicht bekommen, die reguläre C Bootstrap-Code. Insbesondere ist die eigentliche Eintrittspunkt eines Programms unter Linux nicht main()
, sondern eine Funktion _start()
genannt. Die Standardbibliotheken normalerweise eine Version davon bereitzustellen, die eine Initialisierung Code ausgeführt wird, dann ruft main()
.
Versuchen Sie dies mit gcc -nostdlib -m32
Kompilieren:
void _start() {
/* main body of program: call main(), etc */
/* exit system call */
asm("movl $1,%eax;"
"xorl %ebx,%ebx;"
"int $0x80"
);
}
Die _start()
Funktion sollte immer mit einem Aufruf an exit
(oder andere Nicht-Rückkehr Systemaufruf wie exec
) beenden. Das obige Beispiel ruft direkt den Systemaufruf mit Inline-Montage, da der üblicher exit()
nicht verfügbar ist.
Andere Tipps
Die einfachste Art und Weise, ist die C-Code-Objektdateien kompilieren (gcc -c
einige *.o
Dateien zu erhalten) und dann eine direkte Verknüpfung mit dem Linker (ld
). Sie müssen Ihre Objektdateien mit einem paar Extra-Objekt verknüpfen Dateien wie /usr/lib/crt1.o
, um eine Arbeits ausführbare Datei zu erhalten (zwischen dem Eintrittspunkt, wie durch den Kern zu sehen ist, und die main()
Funktion gibt es ein bisschen Arbeit zu tun) . Um zu wissen, was zu Link mit, versuchen Sie mit der glibc Verknüpfung gcc -v
: ein. Dies sollte Ihnen zeigen, was normalerweise in die ausführbare kommt
Sie, dass gcc finden generiert Code, der einige Abhängigkeiten zu einigen versteckten Funktionen haben können. Die meisten von ihnen sind in libgcc.a
. Es kann auch versteckt Anrufe memcpy()
, memmove()
, memset()
und memcmp()
sein, die in der libc sind, so dass Sie Ihre eigenen Versionen bieten müssen können (was nicht schwer ist, zumindest solange man nicht zu wählerisch über die Leistung ist).
Dinge Macht erhalten klarer zu Zeiten, wenn Sie bei der Montage erzeugt aussehen (verwenden Sie die -S
Flagge).