6.10. Anpassen der Toolchain
Nachdem nun die endgültigen C-Bibliotheken installiert wurden, ist es an der Zeit, die Toolchain so anzupassen, dass sie jedes neu kompilierte Programm mit diesen neuen Bibliotheken verknüpft.
/tools/bin/{ld,ld-old}
/tools/$(uname -m)-pc-linux-gnu/bin/{ld,ld-old}
/tools/bin/{ld-new,ld}
/tools/bin/{ld,ld-old}
/tools/$(uname -m)-pc-linux-gnu/bin/{ld,ld-old}
/tools/bin/{ld-new,ld}
Sichern Sie zunächst die /Werkzeuge Linker und ersetzen Sie ihn durch den angepassten Linker, den wir in Kapitel 5 erstellt haben. Wir erstellen auch einen Link zu seinem Gegenstück in /tools/$(uname -m)-pc-linux-gnu/bin:
mv mv mv
ln
-v
-v
-v
mv mv mv
ln
-sv /tools/bin/ld /tools/$(uname -m)-pc-linux-gnu/bin/ld
-sv /tools/bin/ld /tools/$(uname -m)-pc-linux-gnu/bin/ld
Als nächstes ändern Sie die GCC-Spezifikationsdatei so, dass sie auf den neuen dynamischen Linker verweist. Durch einfaches Löschen aller Instanzen von „/tools“ sollten wir den richtigen Pfad zum dynamischen Linker erhalten. Passen Sie außerdem die Spezifikationsdatei an, damit GCC weiß, wo sich die richtigen Header und Glibc-Startdateien befinden. A Durst Befehl erreicht Folgendes:
gcc -dumpspecs | sed -e 's@/tools@@g' \
-e '/\*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}' \
-e '/\*cpp:/{n;s@$@ -isystem /usr/include@}' > \
`Verzeichnisname $(gcc --print-libgcc-Dateiname)`/specs
gcc -dumpspecs | sed -e 's@/tools@@g' \
-e '/\*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}' \
-e '/\*cpp:/{n;s@$@ -isystem /usr/include@}' > \
`Verzeichnisname $(gcc --print-libgcc-Dateiname)`/specs
Es empfiehlt sich, die Spezifikationsdatei visuell zu prüfen, um sicherzustellen, dass die beabsichtigte Änderung tatsächlich vorgenommen wurde.
An dieser Stelle muss unbedingt sichergestellt werden, dass die Grundfunktionen (Kompilierung und Verknüpfung) der angepassten Toolchain wie erwartet funktionieren. Führen Sie dazu die folgenden Plausibilitätsprüfungen durch:
echo 'int main(){}' > dummy.c
cc dummy.c -v -Wl,--verbose &> dummy.log readelf -l a.out | grep ': /lib'
echo 'int main(){}' > dummy.c
cc dummy.c -v -Wl,--verbose &> dummy.log readelf -l a.out | grep ': /lib'
Es sollten keine Fehler auftreten und die Ausgabe des letzten Befehls lautet (unter Berücksichtigung plattformspezifischer Unterschiede im Namen des dynamischen Linkers):
[Programminterpreter anfordern: /lib64/ld-linux-x86-64.so.2]
[Programminterpreter anfordern: /lib64/ld-linux-x86-64.so.2]
Beachten Sie dies auf 64-Bit-Systemen / lib ist der Speicherort unseres dynamischen Linkers, der Zugriff erfolgt jedoch über einen symbolischen Link in /lib64.
Note
Auf 32-Bit-Systemen sollte der Interpreter /lib/ld-linux.so.2 sein.
Note
Auf 32-Bit-Systemen sollte der Interpreter /lib/ld-linux.so.2 sein.
Stellen Sie nun sicher, dass wir die richtigen Startdateien verwenden:
grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log
grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log
Die Ausgabe des letzten Befehls sollte sein:
/usr/lib/../lib/crt1.o erfolgreich
/usr/lib/../lib/crti.o erfolgreich
/usr/lib/../lib/crtn.o erfolgreich
/usr/lib/../lib/crt1.o erfolgreich
/usr/lib/../lib/crti.o erfolgreich
/usr/lib/../lib/crtn.o erfolgreich
Stellen Sie sicher, dass der Compiler nach den richtigen Header-Dateien sucht:
grep -B1 '^ /usr/include' dummy.log
grep -B1 '^ /usr/include' dummy.log
Dieser Befehl sollte die folgende Ausgabe zurückgeben:
#include <...> Suche beginnt hier:
/ usr / include
#include <...> Suche beginnt hier:
/ usr / include
Überprüfen Sie als Nächstes, ob der neue Linker mit den richtigen Suchpfaden verwendet wird:
grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
Verweise auf Pfade, die Komponenten mit „-linux-gnu“ enthalten, sollten ignoriert werden, ansonsten sollte die Ausgabe des letzten Befehls wie folgt lauten:
SEARCH_DIR("/usr/lib") SEARCH_DIR("/lib")
SEARCH_DIR("/usr/lib") SEARCH_DIR("/lib")
Stellen Sie als Nächstes sicher, dass wir die richtige libc verwenden:
grep "/lib.*/libc.so.6 " dummy.log
grep "/lib.*/libc.so.6 " dummy.log
Die Ausgabe des letzten Befehls sollte sein:
Der Versuch, /lib/libc.so.6 zu öffnen, war erfolgreich
Der Versuch, /lib/libc.so.6 zu öffnen, war erfolgreich
Stellen Sie abschließend sicher, dass GCC den richtigen dynamischen Linker verwendet:
grep hat dummy.log gefunden
grep hat dummy.log gefunden
Die Ausgabe des letzten Befehls sollte lauten (unter Berücksichtigung plattformspezifischer Unterschiede im Namen des dynamischen Linkers):
ld-linux-x86-64.so.2 unter /lib/ld-linux-x86-64.so.2 gefunden
ld-linux-x86-64.so.2 unter /lib/ld-linux-x86-64.so.2 gefunden
Wenn die Ausgabe nicht wie oben dargestellt aussieht oder überhaupt nicht empfangen wird, liegt ein schwerwiegender Fehler vor. Untersuchen Sie die Schritte und verfolgen Sie sie erneut, um herauszufinden, wo das Problem liegt, und beheben Sie es. Der wahrscheinlichste Grund ist, dass bei der Anpassung der Spezifikationsdatei ein Fehler aufgetreten ist. Alle Probleme müssen gelöst werden, bevor mit dem Prozess fortgefahren werden kann.
Sobald alles ordnungsgemäß funktioniert, bereinigen Sie die Testdateien:
rm -v dummy.c a.out dummy.log
rm -v dummy.c a.out dummy.log