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
Versuchen Sie es mit der -static
Flagge?
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
Vergewissern Sie sich, dass es wirklich keine dynamische Verknüpfung
ldd yourexecutable
sollte zurückgeben „keine dynamische ausführbare“ oder etwas Gleichwertiges.
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
Schließlich überprüfen, ob Sie links oder sollten enthalten kann tatsächlich Ihre ausführbare Datei ausführen
Dies sollte die akzeptierte Antwort sein! –
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. –
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
Ich habe etwas über die Verwendung der Konfigurationsoption "-disable-shared" gelesen. Ist dies nicht notwendig, um eine eigenständige ausführbare Datei zu kompilieren? –