Domanda

Sono consapevole che è possibile utilizzare readelf -d <elf> | grep RPATH per ispezionare un dato binario dal guscio, ma è possibile farlo all'interno di un processo?

Qualcosa di simile (il mio completamente composta chiamata di sistema):

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

Sto cercando di diagnosticare alcuni così sospetto che collega i problemi nella nostra base di codice, e vorrebbe ispezionare il RPATH questo modo, se possibile (Preferirei non dover deporre le uova uno script esterno).

È stato utile?

Soluzione

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

Altri suggerimenti

Per la cronaca, ecco un paio di comandi che mostrerà l'intestazione rpath.

objdump -x binary-or-library |grep RPATH

Forse un modo migliore per farlo è il seguente:

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

Il secondo comando elenca anche le dipendenze dirette su altre librerie seguiti da rpath.

È inoltre possibile utilizzare:

chrpath -l binary-or-library
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top