Il progetto GNU Binutils (contenente GNU linker (ld)) non è all'origine di questo cambiamento di comportamento, ma Debian (2016)1 e Gentoo (2013!)2.
Secondo gentoo commit di Mike Frysinger nel gennaio 2013 :
"Le "nuove" opzioni di dtags sono in circolazione da più di 14 anni, quindi per i target Linux e GNU, abilitale per impostazione predefinita."
Questa modifica non è stata ben accolta 3, 4, 5, poiché RUNPATH e RPATH hanno "differenze di comportamento non documentate"... Sorprendentemente queste modifiche sono ora applicate su Debian stable.
Il problema è che l'utilizzo di RUNPATH porta a problemi imprevedibili... Ma principalmente funziona. Da wikipedia:
Il linker dinamico ld non cerca le posizioni DT_RUNPATH per dipendenze transitive , a differenza di DT_RPATH.
C'è un modo per forzare il vecchio comportamento?
Sì. Puoi usare questa opzione -Wl,--disable-new-dtags
per raccontare il nuovo linker per utilizzare il vecchio comportamento, ovvero RPATH.
È possibile dire alla vecchia versione del linker di produrre il nuovo output (cioè RUNPATH invece di RPATH)?
Sì. Usa -Wl,--enable-new-dtags
per raccontare il vecchio linker per utilizzare il nuovo comportamento, ovvero RUNPATH.
Ho verificato l'eseguibile con readelf
e queste due opzioni sembrano controllare ciò che verrà scritto nella sezione ELF Dynamic. Penso che il problema sia stato causato da un cambiamento nelle impostazioni predefinite per la nuova versione, anche se, curiosamente, la pagina di manuale per ld
suggerirebbe che dovrebbe essere sempre lo stesso:
--enable-new-dtags
--disable-new-dtags
Questo linker può creare i nuovi tag dinamici in ELF. Ma i vecchi sistemi ELF potrebbero non capirli. Se specifichi--enable-new-dtags, i nuovi tag dinamici verranno creati secondo necessità e i tag dinamici precedenti verranno omessi. Se specifichi --disable-new-dtags, non verranno creati nuovi tag dinamici. Per impostazione predefinita, i nuovi tag dinamici non vengono creati. Tieni presente che queste opzioni sono disponibili solo per i sistemi ELF.