GNU/Linux >> Tutoriels Linux >  >> Linux

Comment définir RPATH et RUNPATH avec GCC/LD ?

Le projet GNU Binutils (contenant GNU linker (ld)) n'est pas à l'origine de ce changement de comportement, mais Debian (2016)1, et Gentoo (2013 !)2.

Selon le commit gentoo de Mike Frysinger en janvier 2013 :

"Les "nouvelles" options de dtags existent depuis plus de 14 ans maintenant, donc pour les cibles Linux et GNU, activez-les par défaut."

Ce changement n'est pas bien reçu 3, 4, 5, car RUNPATH et RPATH ont une "différence de comportement non documentée"... Étonnamment, ce changement est maintenant appliqué sur Debian stable.

Le problème est que l'utilisation de RUNPATH entraîne des problèmes imprévisibles... Mais fonctionne principalement. De wikipédia :

L'éditeur de liens dynamique ld ne recherche pas les emplacements DT_RUNPATH pour les dépendances transitives , contrairement à DT_RPATH.


Existe-t-il un moyen de forcer l'ancien comportement ?

Oui. Vous pouvez utiliser cette option -Wl,--disable-new-dtags dire au nouveau linker pour utiliser l'ancien comportement, c'est-à-dire RPATH.

Est-il possible de dire à l'ancienne version de l'éditeur de liens de produire la nouvelle sortie (c'est-à-dire RUNPATH au lieu de RPATH) ?

Oui. Utilisez -Wl,--enable-new-dtags dire aux anciens linker pour utiliser le nouveau comportement, c'est-à-dire RUNPATH.

J'ai vérifié l'exécutable avec readelf et ces deux options semblent contrôler ce qui sera écrit dans la section ELF Dynamic. Je pense que le problème a été causé par un changement dans les valeurs par défaut pour la nouvelle version, bien que, fait intéressant, la page de manuel pour ld suggérerait qu'il devrait toujours être le même :

--enable-new-dtags
--disable-new-dtags
Cet éditeur de liens peut créer les nouvelles balises dynamiques dans ELF. Mais les anciens systèmes ELF peuvent ne pas les comprendre. Si vous spécifiez--enable-new-dtags, les nouvelles balises dynamiques seront créées selon les besoins et les anciennes balises dynamiques seront omises. Si vous spécifiez --disable-new-dtags, aucune nouvelle balise dynamique ne sera créée. Par défaut, les nouvelles balises dynamiques ne sont pas créées. Notez que ces options ne sont disponibles que pour les systèmes ELF.


Linux
  1. Comment gérer les bibliothèques dynamiques et statiques sous Linux

  2. Comment définir le fuseau horaire et synchroniser l'heure du serveur avec NTP sous Linux

  3. Comment configurer LogAnalyzer avec Rsyslog et MySQL

  4. Comment faire une incrémentation atomique et récupérer en C?

  5. Comment configurer correctement zram et swap

Comment configurer un pare-feu avec GUFW sous Linux

Comment définir la date et l'heure sous Linux

Comment définir et supprimer des variables d'environnement sous Linux

Comment configurer Mailman avec Debian et ISPConfig

Comment installer et configurer un VPN avec OpenVPN sur Ubuntu 18.04

Comment installer et configurer WordPress avec Ansible