2010-05-14 13 views
50

Tôi biết rằng có thể sử dụng 'readelf -d | grep RPATH 'để kiểm tra một nhị phân đã cho từ trình bao, nhưng có thể thực hiện điều này trong một tiến trình không?Có cách nào để kiểm tra rpath hiện tại trên Linux không?

Giống như (hoàn toàn tạo thành hệ thống gọi của tôi):

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

Tôi đang cố gắng để chẩn đoán một số nghi ngờ SO liên kết các vấn đề trong codebase của chúng tôi, và muốn kiểm tra việc rPath cách này nếu có thể (tôi 'd thay vì không phải sinh ra một kịch bản bên ngoài).

Trả lờ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

thật tuyệt vời, nhưng nó không hoạt động với $ ORIGIN. $ ORIGIN không được giải thích và được trả về bởi hàm. Có cách nào để thêm giải thích $ ORIGIN không? –

+1

@ Jérôme Nếu bạn đang thực hiện trong một môi trường nơi '/ proc' được gắn, sau đó mở rộng' $ ORIGIN' đơn giản như 'readlink ("/proc/self/exe ", ...)' sau đó NUL-chấm dứt tại dấu gạch chéo cuối cùng. –

99

Để ghi lại, dưới đây là một vài lệnh sẽ hiển thị tiêu đề rpath.

objdump -x binary-or-library |grep RPATH 

Có lẽ một cách tốt hơn để làm điều đó là như sau:

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

Lệnh thứ hai cũng liệt kê các phụ thuộc trực tiếp vào các thư viện khác tiếp theo rpath.

+3

Trên ubuntu 15.04 tôi phải sử dụng: objdump -x binary-or-library | grep RUNPATH –

+0

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

-1

có thể bạn có thể sử dụng mã từ github.com/NixOS/patchelf nhưng AFAIK không phải là máy ATM thư viện.