2010-05-14 11 views
50

Sono consapevole che è possibile utilizzare 'readelf -d | grep RPATH 'per ispezionare un dato binario dalla shell, ma è possibile farlo all'interno di un processo?C'è un modo per ispezionare il rpath corrente su Linux?

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 sospettano SO che collega i problemi nella nostra base di codice, e vorrei ispezionare il RPATH questo modo, se possibile (I Preferirei non dover generare uno script esterno).

risposta

38
#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; 
} 
+1

è brillante, ma non funziona con $ ORIGIN. $ ORIGIN non è interpretato e restituito com'è dalla funzione. C'è un modo per aggiungere l'interpretazione $ ORIGIN? –

+1

@ Jérôme Se si sta eseguendo in un ambiente in cui '/ proc' è montato, quindi l'espansione' $ ORIGIN' è semplice come 'readlink ("/proc/self/exe ", ...)' quindi NUL-termina a l'ultimo taglio. –

99

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

objdump -x binary-or-library |grep RPATH 

Forse un modo migliore per farlo è la seguente:

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

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

+3

Su ubuntu 15.04 devo usare: objdump -x binary-or-library | grep RUNPATH –

+0

RPATH! = RUNPATH, vedere http://stackoverflow.com/questions/7967848/use-rpath-but-not-runpath & http : //blog.qt.io/blog/2011/10/28/rpath-and-runpath/ –

-1

forse è possibile utilizzare il codice da github.com/NixOS/patchelf ma AFAIK non è una libreria ATM.

Problemi correlati