Původem této změny chování není projekt GNU Binutils (obsahující GNU linker (ld)), ale Debian (2016)1 a Gentoo (2013!)2.
Podle gentoo commitu od Mikea Frysingera z ledna 2013:
"Nové" možnosti značek dtag jsou k dispozici již více než 14 let, takže pro cíle Linux a GNU je ve výchozím nastavení povolte."
Tato změna není dobře přijata 3, 4, 5, protože RUNPATH a RPATH mají "nedokumentovaný rozdíl v chování"... Překvapivě jsou tyto změny nyní aplikovány na stabilní Debian.
Problém je v tom, že používání RUNPATH vede k nepředvídatelným problémům...Ale hlavně funguje . Z wikipedie:
Původní dynamický linker nevyhledává umístění DT_RUNPATH propřechodné závislosti , na rozdíl od DT_RPATH.
Existuje způsob, jak vynutit staré chování?
Ano. Můžete použít tuto volbu -Wl,--disable-new-dtags
sdělit nové linker k použití starého chování, tj. RPATH.
Je možné říci staré verzi linkeru, aby vytvořila nový výstup (tj. RUNPATH místo RPATH)?
Ano. Použijte -Wl,--enable-new-dtags
říct starému linker k použití nového chování, tj. RUNPATH.
Ověřil jsem spustitelný soubor pomocí readelf
a zdá se, že tyto dvě možnosti řídí, co bude napsáno v sekci ELF Dynamic. Myslím, že problém byl způsoben změnou výchozích hodnot pro novou verzi, i když je zajímavé, že manuálová stránka pro ld
by naznačovalo, že by to mělo být stále stejné:
--enable-new-dtags
--disable-new-dtags
Tento linker může vytvářet nové dynamické značky v ELF. Ale starší systémy ELF jim nemusí rozumět. Pokud zadáte--enable-new-dtags, budou nové dynamické značky vytvořeny podle potřeby a starší dynamické značky budou vynechány. Pokud zadáte --disable-new-dtags, nebudou vytvořeny žádné nové dynamické značky. Ve výchozím nastavení se nové dynamické značky nevytvářejí. Všimněte si, že tyto možnosti jsou dostupné pouze pro systémy ELF.