2010-05-14 2 views
50

'readelf -d |'를 사용할 수 있다는 것을 알고 있습니다. grep RPATH '를 사용하여 쉘에서 주어진 바이너리를 검사 할 수 있지만 프로세스 내에서이를 수행 할 수 있습니까? 같은Linux에서 현재 rpath를 검사 할 수있는 방법이 있습니까?

뭔가 (내 완전히 만든 시스템 호출) :

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

내가 SO 우리의 코드베이스에 문제를 연결하는 몇 가지 의심을 진단하기 위해 노력하고있어 및 RPATH이 방법 가능한 경우를 검사하고 싶습니다 (I 오히려 외부 스크립트를 생성 할 필요가 없음).

답변

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

그것은 훌륭하지만 $ ORIGIN에서는 작동하지 않습니다. $ ORIGIN은 해석되지 않고 함수에 의해 그대로 반환됩니다. $ ORIGIN 해석을 추가 할 수있는 방법이 있습니까? –

+1

@ Jérôme'/ proc'가 마운트 된 환경에서 실행하면'$ ORIGIN'을 확장하는 것은'readlink ("/ proc/self/exe", ...)처럼 간단합니다. 그런 다음 NUL-terminate at 마지막 슬래시. –

99

레코드의 경우 여기에 rpath 헤더를 표시하는 몇 가지 명령이 있습니다. 어쩌면

objdump -x binary-or-library |grep RPATH 

그것을 할 수있는 더 나은 방법

은 다음과 같다 :

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

두 번째 명령은 rpath 다음에 다른 라이브러리에 직접 종속성을 보여줍니다.

+3

우분투 15.04에서 : objdump -x 바이너리 또는 라이브러리 | grep RUNPATH –

+0

RPATH! = RUNPATH, http://stackoverflow.com/questions/7967848/use-rpath-but-not-runpath 및 http를 참조하십시오. : //blog.qt.io/blog/2011/10/28/rpath-and-runpath/ –

-1

아마도 github.com/NixOS/patchelf의 코드를 사용할 수 있지만 AFAIK 라이브러리 ATM이 아닙니다.