Soy consciente de que es posible usarlo readelf -d <elf> | grep RPATH
para inspeccionar un binario dado desde el shell, pero ¿es posible hacer esto dentro de un proceso?
Algo como (mi llamada al sistema completamente inventada):
/* get a copy of current rpath into buffer */
sys_get_current_rpath(&buffer);
Estoy tratando de diagnosticar algunos problemas sospechosos de vinculación de SO en nuestra base de código y me gustaría inspeccionar el RPATH de esta manera si es posible (prefiero no tener que generar un script externo).
grep PATH
hacerlo. Depende del vinculador si se usa RPATH o RUNPATH, y existen diferencias sutiles pero importantes entre los dos: stackoverflow.com/a/52020177Respuestas:
#include <stdio.h> #include <elf.h> #include <link.h> int main() { const ElfW(Dyn) *dyn = _DYNAMIC; const ElfW(Dyn) *rpath = NULL; const char *strtab = NULL; for (; dyn->d_tag != DT_NULL; ++dyn) { if (dyn->d_tag == DT_RPATH) { rpath = dyn; } else if (dyn->d_tag == DT_STRTAB) { strtab = (const char *)dyn->d_un.d_val; } } if (strtab != NULL && rpath != NULL) { printf("RPATH: %s\n", strtab + rpath->d_un.d_val); } return 0; }
fuente
/proc
está montado, entonces expandir$ORIGIN
es tan simple comoreadlink("/proc/self/exe", ...)
luego terminar en NUL en la última barra.RPATH
, me gustaría señalar que es igualmente importante verificar laDT_RUNPATH
etiqueta si uno desea saber las rutas desde las que un binario podría estar cargando sus bibliotecas compartidas.Para el registro, aquí hay un par de comandos que mostrarán el
rpath
encabezado.Quizás una forma aún mejor de hacerlo es la siguiente:
El segundo comando también enumera las dependencias directas de otras bibliotecas seguidas de
rpath
.fuente
También puedes usar:
fuente
apt-get install -y chrpath
Esto es lo que uso por conveniencia, como función de shell:
Esto consume la
eu-readelf
salida deelfutils
como:y emite
Debería funcionar bien con binutils en
readelf
lugar de elfutilseu-readelf
también.fuente