GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie setze ich RPATH und RUNPATH mit GCC/LD?

Das Projekt GNU Binutils (enthält den GNU-Linker (ld)) ist nicht der Ursprung dieser Verhaltensänderung, sondern Debian (2016)1 und Gentoo (2013!)2.

Laut gentoo Commit von Mike Frysinger vom Januar 2013 :

"Die "neuen" dtags-Optionen gibt es jetzt seit mehr als 14 Jahren, also sollten Sie sie für Linux- und GNU-Ziele standardmäßig aktivieren."

Diese Änderung wird nicht gut aufgenommen 3, 4, 5, da RUNPATH und RPATH "undokumentierte Verhaltensunterschiede" haben ... Überraschenderweise werden diese Änderungen jetzt auf Debian Stable angewendet.

Das Problem ist, dass die Verwendung von RUNPATH zu unvorhersehbaren Problemen führt ... Aber hauptsächlich funktioniert es einfach. Aus Wikipedia:

Der dynamische Linker ld durchsucht DT_RUNPATH-Speicherorte nicht nach transitiven Abhängigkeiten , im Gegensatz zu DT_RPATH.


Gibt es eine Möglichkeit, das alte Verhalten zu erzwingen?

Ja. Sie können diese Option -Wl,--disable-new-dtags verwenden um das Neue zu erzählen Linker, um den alten zu verwenden Verhalten, d.h. RPATH.

Ist es möglich, die alte Version des Linkers anzuweisen, die neue Ausgabe zu erzeugen (d. h. RUNPATH statt RPATH)?

Ja. Verwenden Sie -Wl,--enable-new-dtags um es den alten zu sagen Linker, um den neuen zu verwenden Verhalten, d.h. RUNPATH.

Ich habe die ausführbare Datei mit readelf verifiziert und diese beiden Optionen scheinen zu steuern, was im Abschnitt ELF Dynamic geschrieben wird. Ich denke, das Problem wurde durch eine Änderung der Standardeinstellungen für die neue Version verursacht, obwohl interessanterweise die Handbuchseite für ld würde vorschlagen, dass es immer noch dasselbe sein sollte:

--enable-new-dtags
--disable-new-dtags
Dieser Linker kann die neuen dynamischen Tags in ELF erstellen. Aber die älteren ELF-Systeme verstehen sie möglicherweise nicht. Wenn Sie --enable-new-dtags angeben, werden die neuen dynamischen Tags nach Bedarf erstellt und ältere dynamische Tags werden ausgelassen. Wenn Sie --disable-new-dtags angeben, werden keine neuen dynamischen Tags erstellt. Standardmäßig werden die neuen dynamischen Tags nicht erstellt. Beachten Sie, dass diese Optionen nur für ELF-Systeme verfügbar sind.


Linux
  1. Umgang mit dynamischen und statischen Bibliotheken unter Linux

  2. So stellen Sie die Zeitzone ein und synchronisieren die Serverzeit mit NTP in Linux

  3. So richten Sie LogAnalyzer mit Rsyslog und MySQL ein

  4. Wie stellt man das Datum im Epochenformat ein?

  5. So richten Sie Apache mit MPM Event und PHP-FPM unter Ubuntu 20.04 ein

So richten Sie eine Firewall mit GUFW unter Linux ein

So stellen Sie Datum und Uhrzeit unter Linux ein

So setzen und löschen Sie Umgebungsvariablen unter Linux

So richten Sie Mailman mit Debian und ISPConfig ein

So richten Sie ein VPN mit OpenVPN unter Ubuntu 18.04 ein und konfigurieren es

So installieren und konfigurieren Sie WordPress mit Ansible