OnWorks Linux- und Windows-Online-WorkStations

Logo

Kostenloses Online-Hosting für WorkStations

<Zurück | Inhalte | Weiter>

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.

Image

/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]


Image

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


Top OS Cloud Computing bei OnWorks: