GNU/Linux >> Znalost Linux >  >> Linux

Jak nastavit RPATH a RUNPATH s GCC/LD?

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.


Linux
  1. Jak zacházet s dynamickými a statickými knihovnami v Linuxu

  2. Jak nastavit časové pásmo a synchronizovat čas serveru s NTP v Linuxu

  3. Jak provést atomový přírůstek a načtení v C?

  1. Jak nastavit LogAnalyzer s Rsyslog a MySQL

  2. Jak nastavit datum pomocí formátu Epoch?

  3. Jak správně nastavit zram a swap

  1. Jak nastavit nebo změnit User Agent s curl

  2. Jak vyloučit soubory a adresáře pomocí Rsync

  3. Jak nastavit Apache pomocí události MPM a PHP-FPM na Ubuntu 20.04