Sind dynamische Linker austauschbar?

Sind dynamische Linker austauschbar?

Sind dynamische Linker austauschbar?

Nehmen wir an, ich kompiliere ein Programm, beispielsweise mit gcc, und verlinke verschiedene dynamische Bibliotheken, wobei das Programm zur Laufzeit mit dem GNU-Linker zum Auflösen der Symbole der dynamischen Bibliotheken verwendet werden soll. Und dann habe ich statt des GNU-Linkers einen anderen Linker, den ich brauche oder verwenden möchte.

Wird das funktionieren? Warum/warum nicht?

Antwort1

Ich gehe davon aus, dass Sie mit „dynamischer Linker“ den dynamischen Linker/Loader meinen, der üblicherweise als bezeichnet wird ld.so, und nicht den Linker, der beim Erstellen von Programmen verwendet wird, ld.

Der dynamische Linker/Loader ist eng mit der C-Bibliothek verbunden, mit der er verknüpft ist oder von der er sogar Teil ist. Unter Linux ist der übliche Loader, wie hier typischerweise besprochen, der Loader der GNU C-Bibliothek. Wenn Sie sich seine Symbole ansehen, werden Sie feststellen, dass er Symbole aus der C-Bibliothek einbindet:

$ nm -D /lib/ld-linux.so.2 | grep -E ' A|D '
00028898 D _dl_argv
00000000 A GLIBC_2.0
00000000 A GLIBC_2.1
00000000 A GLIBC_2.3
00000000 A GLIBC_2.4
00000000 A GLIBC_PRIVATE
00028f28 D __libc_enable_secure
00028f24 D __libc_stack_end
00029040 D _rtld_global
000288a0 D _rtld_global_ro

SehenWie kann der dynamische Linker/Loader selbst dynamisch verknüpft werden, wie von „Datei“ gemeldet?für Einzelheiten zur Funktionsweise.

Alternative C-Bibliotheken stellen ihre eigenen dynamischen Lader zur Verfügung. Beispielsweise können mitmuselGeben Sie auf x86_64 ihren „Interpreter“ als an /lib/ld-musl-x86_64.so.1, was ein Link zur musl-C-Bibliothek selbst ist:

$ ls -l /lib/ld-musl-x86_64.so.1
lrwxrwxrwx 1 root root 25 Jan 23  2019 /lib/ld-musl-x86_64.so.1 -> x86_64-linux-musl/libc.so

Loader sind auf die Funktionen ihrer zugehörigen C-Bibliotheken angewiesen und umgekehrt.würdetechnisch gesehen ist es möglich, einen bestimmten Loader durch eine kompatible Implementierung zu ersetzen, aber Sie würden effektiv zumindest den vorhandenen Loader neu schreiben. Während die grundlegende Spezifikation eines dynamischen Loaders klar definiert und begrenzt ist – Laden einer ELF-Binärdatei (unter Linux), zugehörige dynamische Bibliotheken und Durchführen der erforderlichen Verschiebung usw. – und man sich daher vorstellen könnte, einen beliebigen Loader durch einen anderen zu ersetzen, sind die Implementierungsdetails alle von Bedeutung.

Beachten Sie, dass es möglich ist, dass ein einzelnes System verschiedene Loader hat, die von den Programmen je nach Bedarf verwendet werden, solange jeder dynamische Loader einen anderen kanonischen Namen hat. Auf diese Weise ist es möglich, dass ein auf der GNU C-Bibliothek basierendes System auch zum Erstellen und Ausführen von musl-Binärdateien verwendet werden kann, und es eröffnet den Weg für Bemühungen wiellvm-libc, oder sogar historisch gesehen der Wechsel von libc.so.5zu libc.so.6.

Antwort2

Sie müssen austauschbar sein.

Eine gute Diskussion über „eg ldvs.“ goldfinden Sie hier:https://stackoverflow.com/questions/3476093/replacing-ld-with-gold-any-experience

Überprüfen Sie auch dies:https://stackoverflow.com/questions/29361801/ist der LLD-Linker ein Drop-in-Ersatz für LD und Gold

Es gibt auch LLD aus dem LLVM-Projekt, das verspricht, dasam schnellstenVon allen.

verwandte Informationen