Existe uma maneira de inspecionar o atual RPath no Linux?
Pergunta
Estou ciente de que é possível usar readelf -d <elf> | grep RPATH
Para inspecionar um determinado binário da concha, mas é possível fazer isso dentro de um processo?
Algo como (minha chamada de sistema completamente inventada):
/* get a copy of current rpath into buffer */
sys_get_current_rpath(&buffer);
Estou tentando diagnosticar alguns suspeitos, vinculando problemas em nossa base de código e gostaria de inspecionar o RPath dessa maneira, se possível (prefiro não ter que gerar um script externo).
Solução
#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;
}
Outras dicas
Para o registro, aqui estão alguns comandos que mostrarão o rpath
cabeçalho.
objdump -x binary-or-library |grep RPATH
Talvez uma maneira ainda melhor de fazer isso seja o seguinte:
readelf -d binary-or-library |head -20
O segundo comando também lista as dependências diretas de outras bibliotecas seguidas por rpath
.
Você também pode usar:
chrpath -l binary-or-library
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow