ejemplos - crear archivo en linux
¿Hay alguna manera de inspeccionar la ruta actual en Linux? (4)
Para el registro, aquí hay un par de comandos que mostrarán el encabezado rpath
.
objdump -x binary-or-library |grep RPATH
Quizás una mejor manera de hacerlo es la siguiente:
readelf -d binary-or-library |head -20
El segundo comando también enumera las dependencias directas de otras bibliotecas seguidas de rpath
.
Soy consciente de que es posible usar readelf -d <elf> | grep RPATH
readelf -d <elf> | grep RPATH
para inspeccionar un binario dado desde el shell, pero ¿es posible hacerlo dentro de un proceso?
Algo así como (mi llamada al sistema completamente hecha):
/* 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 nuestro código base, y me gustaría inspeccionar el RPATH de esta manera si es posible (preferiría no tener que generar un script externo).
También puedes usar:
chrpath -l binary-or-library
quizás pueda usar el código de github.com/NixOS/patchelf pero AFAIK no es un cajero automático de la biblioteca.
#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;
}