GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo configurar RPATH y RUNPATH con GCC/LD?

El proyecto GNU Binutils (que contiene el enlazador GNU (ld)) no está en el origen de este cambio de comportamiento, sino Debian (2016)1 y Gentoo (¡2013!)2.

Según el compromiso de gentoo de Mike Frysinger en enero de 2013:

"Las "nuevas" opciones de dtags existen desde hace más de 14 años, así que para los objetivos de Linux y GNU, actívelas de forma predeterminada".

Este cambio no es bien recibido 3, 4, 5, ya que RUNPATH y RPATH tienen "diferencias de comportamiento no documentadas"... Sorprendentemente, estos cambios ahora se aplican en Debian estable.

El problema es que usar RUNPATH conduce a problemas impredecibles... Pero principalmente funciona. De wikipedia:

El enlazador dinámico ld no busca ubicaciones DT_RUNPATH para dependencias transitivas , a diferencia de DT_RPATH.


¿Hay alguna forma de forzar el antiguo comportamiento?

Sí. Puedes usar esta opción -Wl,--disable-new-dtags para decir lo nuevo enlazador para usar el antiguo comportamiento, es decir, RPATH.

¿Es posible decirle a la versión anterior del enlazador que produzca la nueva salida (es decir, RUNPATH en lugar de RPATH)?

Sí. Usa -Wl,--enable-new-dtags decirle a los viejos enlazador para usar el nuevo comportamiento, es decir, RUNPATH.

Verifiqué el ejecutable con readelf y estas dos opciones parecen controlar lo que se escribirá en la sección ELF Dynamic. Creo que el problema se debió a un cambio en los valores predeterminados de la nueva versión, aunque, curiosamente, la página del manual para ld sugeriría que debería seguir siendo el mismo:

--habilitar-nuevas-dtags
--disable-new-dtags
Este enlazador puede crear las nuevas etiquetas dinámicas en ELF. Pero los sistemas ELF más antiguos pueden no entenderlos. Si especifica --enable-new-dtags, las nuevas etiquetas dinámicas se crearán según sea necesario y se omitirán las etiquetas dinámicas anteriores. Si especifica --disable-new-dtags, no se crearán nuevas etiquetas dinámicas. De forma predeterminada, las nuevas etiquetas dinámicas no se crean. Tenga en cuenta que esas opciones solo están disponibles para los sistemas ELF.


Linux
  1. Cómo manejar bibliotecas dinámicas y estáticas en Linux

  2. Cómo configurar la zona horaria y sincronizar la hora del servidor con NTP en Linux

  3. Cómo configurar LogAnalyzer con Rsyslog y MySQL

  4. ¿Cómo configurar la fecha con el formato de época?

  5. ¿Cómo hacer un incremento atómico y buscar en C?

Cómo configurar un cortafuegos con GUFW en Linux

Cómo configurar la fecha y la hora en Linux

Cómo configurar y desactivar variables de entorno en Linux

Cómo configurar Mailman con Debian e ISPConfig

Cómo instalar y configurar una VPN con OpenVPN en Ubuntu 18.04

Cómo instalar y configurar WordPress con Ansible