Có cách nào để kiểm tra rpath hiện tại trên Linux không?


82

Tôi biết rằng có thể sử dụng readelf -d <elf> | grep RPATHđể kiểm tra một tệp nhị phân nhất định từ trình bao, nhưng liệu có thể thực hiện điều này trong một quy trình không?

Một cái gì đó như (cuộc gọi hệ thống hoàn toàn được tạo 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ố vấn đề liên kết SO đáng ngờ trong cơ sở mã của chúng tôi và muốn kiểm tra RPATH theo cách này nếu có thể (tôi không muốn phải tạo tập lệnh bên ngoài).


1
Hãy nhớ rằng khi chẩn đoán các sự cố thư viện được chia sẻ, bạn cũng nên kiểm tra thẻ RUNPATH. Vì vậy, bạn nên grep PATHthay thế. Việc sử dụng RPATH hay RUNPATH là tùy thuộc vào trình liên kết và có những khác biệt nhỏ nhưng quan trọng giữa hai: stackoverflow.com/a/52020177
Nicolas Capens

Câu trả lời:


54
#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
nó rất rực rỡ, nhưng nó không hoạt động với $ ORIGIN. $ ORIGIN không được diễn giải và được hàm trả về như cũ. Có cách nào để thêm diễn giải $ ORIGIN không?
Jérôme

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

Mặc dù câu hỏi đặc biệt về vấn đề này RPATH, nhưng tôi muốn lưu ý rằng việc kiểm tra DT_RUNPATHthẻ cũng quan trọng không kém nếu người ta muốn biết các đường dẫn mà một tệp nhị phân có thể đang tải các thư viện được chia sẻ của nó.
Nicolas mở cửa

154

Đối với bản ghi, đây là một số lệnh sẽ hiển thị rpathtiêu đề.

objdump -x binary-or-library |grep RPATH

Có thể một cách thậm chí còn tốt hơn để làm điều đó là:

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 theo sau rpath.


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


11
Câu trả lời này không liên quan gì đến câu hỏi đã được hỏi (và được chứa trong chính câu hỏi).
Nga có việc làm


1

Đây là những gì tôi sử dụng để thuận tiện, như một hàm shell:

function getrpath {
    eu-readelf -d "${1:?}" | sed -e '/RUNPATH/{s~.*\[\(.*\)\]~\1~;n};d'
}

Điều này tiêu thụ eu-readelfđầu ra từ elfutilsnhư:

Type              Value
NEEDED            Shared library: [libpq.so.5]
NEEDED            Shared library: [libc.so.6]
RUNPATH           Library runpath: [/some/path/to/lib]
....

và phát ra

 /some/path/to/lib

Nó sẽ hoạt động tốt với binutils readelfthay vì elfutils eu-readelf.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.