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

War es hilfreich?

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).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top