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.