2010-05-14 15 views
50

Soy consciente de que es posible usar 'readelf -d | grep RPATH 'para inspeccionar un binario dado del shell, pero ¿es posible hacer esto dentro de un proceso?¿Hay alguna manera de inspeccionar el rpath actual en Linux?

Algo así como (mi completo compuesto por llamada al sistema):

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

Estoy tratando de diagnosticar algunos sospechan SO vincular los temas en nuestra base de código, y me gustaría inspeccionar la rPath esta manera, si es posible (I preferiría no tener que generar una secuencia de comandos externa).

Respuesta

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

es genial, pero no funciona con $ ORIGIN. $ ORIGIN no se interpreta, y la función lo devuelve tal cual. ¿Hay alguna manera de agregar la interpretación $ ORIGIN? –

+1

@ Jérôme Si está ejecutando en un entorno donde '/ proc' está montado, expandir' $ ORIGIN' es tan simple como 'readlink ("/proc/self/exe ", ...)' luego NUL-terminate at la última barra. –

99

Para el registro, aquí hay un par de comandos que le mostrará la cabecera rpath.

objdump -x binary-or-library |grep RPATH 

Tal vez una mejor manera de hacerlo es la siguiente:

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

El segundo comando también enumera las dependencias directas sobre otras bibliotecas seguido de rpath.

+3

En ubuntu 15.04 tengo que usar: objdump -x binary-or-library | grep RUNPATH –

+0

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

-1

quizás pueda usar el código de github.com/NixOS/patchelf pero AFAIK no es un cajero automático de la biblioteca.

Cuestiones relacionadas