Je suis conscient qu'il est possible d'utiliser readelf -d <elf> | grep RPATH
pour inspecter un binaire donné à partir du shell, mais est-il possible de le faire dans un processus?
Quelque chose comme (mon appel système entièrement composé):
/* get a copy of current rpath into buffer */
sys_get_current_rpath(&buffer);
J'essaie de diagnostiquer certains problèmes de liaison suspect SO dans notre base de code, et j'aimerais inspecter le RPATH de cette façon si possible (je préférerais ne pas générer de script externe).
#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;
}
Pour mémoire, voici quelques commandes qui afficheront l'en-tête rpath
.
objdump -x binary-or-library |grep RPATH
Peut-être qu'une meilleure façon de le faire est la suivante:
readelf -d binary-or-library |head -20
La deuxième commande répertorie également les dépendances directes d’autres bibliothèques suivies de rpath
.
Vous pouvez aussi utiliser:
chrpath -l binary-or-library
vous pouvez peut-être utiliser le code de github.com/NixOS/patchelf mais autant que je sache, ce n'est pas une librairie de banque.