2010-07-19 2 views
21

Ich versuche eine ausführbare Datei (ELF-Datei) zu kompilieren, die kein dynamisches Ladeprogramm verwendet. Ich habe einen Cross-Compiler erstellt, der Mips aus Linux kompiliert, um sie auf einem von mir erstellten Simulator zu verwenden. Ich habe das Flag -static-libgcc beim Kompilieren meiner hello.cpp-Datei (Hallo Weltprogramm) aktiviert. Anscheinend ist das jedoch nicht genug. Weil es in meiner ausführbaren Datei immer noch ein Segment gibt, das den Namen/Pfad des dynamischen Ladeprogramms enthält. Mit welchen Flags erzeuge ich eine ausführbare Datei, die ALLES enthält, das ausgeführt werden muss? Muss ich meinen Cross Compiler neu aufbauen?Kompilieren einer eigenständigen statischen ausführbaren Datei

Antwort

12

Versuchen Sie es mit der -static Flagge?

+0

Gibt es eine gute Ressource zu beschreiben das genaue Ergebnis jedes der gcc-Flags? Ich bin nicht 100% sicher, ob ich das dynamische Laden tatsächlich deaktiviere oder nicht. Wenn ich -static verwende, habe ich immer noch den Namen eines dynamischen Ladeprogramms in meinem .interp-Abschnitt der Elf-Datei. –

+0

http://gcc.gnu.org/onlinedocs/gcc/Option-Index.html Ich habe ein Betriebssystem geschrieben, das elf ausführbare Dateien lädt und ich kann bestätigen, dass das -static-Flag funktioniert, ignoriere einfach das ld-bezogene Zeug und direkt zum Eingabepunkt der ausführbaren Datei springen. – Tomaka17

+0

Ich habe etwas über die Verwendung der Konfigurationsoption "-disable-shared" gelesen. Ist dies nicht notwendig, um eine eigenständige ausführbare Datei zu kompilieren? –

61

Verwenden Sie die folgenden Flags für die Verknüpfung von

-static -static-libgcc -static-libstdc++ 

diese drei Flaggen Einsatz gegen die statischen Versionen aller Abhängigkeiten zu verknüpfen (unter der Annahme, gcc). Beachten Sie, dass Sie in bestimmten Situationen nicht unbedingt alle drei Flaggen benötigen, aber auch nicht "verletzen". Schalten Sie deshalb alle drei ein.

prüfen, ob es funktioniert tatsächlich

  1. Vergewissern Sie sich, dass es wirklich keine dynamische Verknüpfung

    ldd yourexecutable 
    

    sollte zurückgeben „keine dynamische ausführbare“ oder etwas Gleichwertiges.

  2. Vergewissern Sie sich, dass es keine ungelösten Symbole sollten

    nm yourexecutable | grep " U " 
    

    Die Liste leer nur einige spezielle Kernel-Space Symbole wie

    U __tls_get_addr 
    
  3. Schließlich überprüfen, ob Sie links oder sollten enthalten kann tatsächlich Ihre ausführbare Datei ausführen

+2

Dies sollte die akzeptierte Antwort sein! –