Soy consciente de que es posible usarlo readelf -d <elf> | grep RPATHpara 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 PATHhacerlo. 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
/procestá montado, entonces expandir$ORIGINes 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_RUNPATHetiqueta 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
rpathencabezado.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 chrpathEsto es lo que uso por conveniencia, como función de shell:
Esto consume la
eu-readelfsalida deelfutilscomo:y emite
Debería funcionar bien con binutils en
readelflugar de elfutilseu-readelftambién.fuente