Question

Je suis conscient qu'il est possible d'utiliser readelf -d <elf> | grep RPATH pour inspecter un binaire donné de la coquille, mais est-il possible de le faire dans un processus?

Quelque chose comme (mon appel système complètement composé):

  /* get a copy of current rpath into buffer */
  sys_get_current_rpath(&buffer);

Je suis en train de diagnostiquer certains problèmes SO suspect dans notre liant codebase et aimerait inspecter le RPATH cette façon, si possible (je préfère ne pas avoir à frayer un script externe).

Était-ce utile?

La solution

#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;
}

Autres conseils

Pour mémoire, voici quelques commandes qui montrera l'en-tête de rpath.

objdump -x binary-or-library |grep RPATH

Peut-être une façon de faire encore mieux c'est le suivant:

readelf -d binary-or-library |head -20

La seconde commande répertorie également les dépendances directes sur d'autres bibliothèques suivies rpath.

Vous pouvez également utiliser:

chrpath -l binary-or-library
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top