web-dev-qa-db-fra.com

Est-il possible d'inspecter le rpath actuel sous Linux?

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).

60
Justicle
#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;
}
39
Employed Russian

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.

120
Michael Dillon

Vous pouvez aussi utiliser:

chrpath -l binary-or-library
1
Oscar Andreasson

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.

0
qknight