GNU/Linux >> Linux Esercitazione >  >> Linux

Come impostare RPATH e RUNPATH con GCC/LD?

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.


Linux
  1. Come gestire le librerie dinamiche e statiche in Linux

  2. Come impostare il fuso orario e sincronizzare l'ora del server con NTP in Linux

  3. Come configurare LogAnalyzer con Rsyslog e MySQL

  4. Come configurare Apache con MPM Event e PHP-FPM su Ubuntu 20.04

  5. Come eseguire un incremento atomico e recuperare in C?

Come configurare un firewall con GUFW su Linux

Come impostare data e ora su Linux

Come impostare e annullare l'impostazione delle variabili di ambiente su Linux

Come configurare Mailman con Debian e ISPConfig

Come impostare e configurare una VPN con OpenVPN su Ubuntu 18.04

Come installare e configurare WordPress con Ansible