2012-12-07 40 views
50

Tôi có một tệp thực thi cũ được lên lịch cho vùng lưu trữ mẩu tin lưu niệm, nhưng chưa có. Nó dựa trên một số libs đã được gỡ bỏ từ môi trường của tôi, nhưng tôi có một số libs stub nơi nào nó hoạt động tốt. Id giống như để điểm này thực thi để các libs sơ khai. Có, tôi có thể thiết lập LD_LIBRARY_PATH, nhưng thực thi này được gọi từ nhiều kịch bản, và nhiều người dùng và tôi muốn sửa nó ở một chỗ.Tôi có thể thay đổi 'đường dẫn' trong một nhị phân đã biên dịch không?

Tôi không có nguồn cho việc này và sẽ khó thực hiện được. Tôi đã suy nghĩ - tôi có thể chỉnh sửa tập tin này, bằng cách sử dụng một trình soạn thảo nhận thức ELF, và thêm một PATH đơn giản để rpath để có nó nhấn libs mới? Điều này có thể, hoặc khi bạn tạo ra một nhị phân ELF, bạn sửa chữa mọi thứ đến các địa điểm và chúng không thể di chuyển được?

+3

Đưa nó vào một shellscript đặt LD_LIBRARY_PATH và gọi nhị phân. Đặt kịch bản lệnh shell vào một vị trí nằm trong PATH của người gọi. – wildplasser

+0

LD_LIBRARY_PATH được kế thừa bởi các tiến trình con. Bạn có thể không muốn điều đó. – Will

+1

@will yeah và tôi đã nói rằng tôi không muốn làm điều đó. :) –

Trả lời

52

Có một công cụ gọi là chrpath có thể thực hiện việc này - nó có thể có sẵn trong các gói phân phối của bạn.

+0

Rõ ràng là tôi không biết về công cụ này, cảm ơn nhiều –

+6

Chỉ cần lưu ý cho người dùng mac, 'install_name_tool' có thể làm điều này với cờ' -rpath' –

+1

Nếu bạn gặp lỗi: ': không có đường chạy hoặc đường chạy bộ tag found.', bạn không thể sử dụng 'chrpath' để thay thế nó, nhưng bạn có thể sử dụng' patchelf' trong trường hợp này: 'patchelf --set-rpath/path/to/libaries ' – phyatt

94

Có một công cụ phổ biến hơn chrpath được gọi là patchelf. Nó ban đầu được tạo ra để sử dụng trong việc tạo các gói cho Nix và NixOS (hệ thống đóng gói và phân phối GNU/Linux).

Trong trường hợp không có rPath trong một nhị phân (ở đây gọi là rdsamp), chrpath thất bại:

chrpath -r '$ORIGIN/../lib64' rdsamp 
rdsamp: no rpath or runpath tag found. 

Mặt khác,

patchelf --set-rpath '$ORIGIN/../lib64' rdsamp 

thành công tốt.

+6

Đặc biệt, 'patchelf' là có thể thêm rpath vào một binary không chứa rpath, tuy nhiên - nơi 'chrpath' dường như chỉ có thể thay đổi một entry đã có. – maxschlepzig

+2

Như một lưu ý chung, bạn nên hiểu sự khác biệt tinh tế giữa 'đường chạy 'và' đường chạy '. Về cơ bản, người ta có thể ghi đè 'LD_LIBRARY_PATH' và người kia không thể. Để biết chi tiết, hãy xem http://blog.tremily.us/posts/rpath/ –

+2

Điều gây phiền nhiễu là cả 'chrpath' và' patchelf' đều cẩu thả với thuật ngữ của chúng. Ví dụ, lệnh 'patchelf' được hiển thị ở trên sẽ thay đổi' runpath' nhưng không thay đổi 'rpath' trừ khi bạn cũng cung cấp tùy chọn' --force-rpath'. –

0

Điều này phù hợp với tôi, thay thế XORIGIN bằng $ ORIGIN.

chrpath -r '\$\ORIGIN/../lib64' httpd

Các vấn đề liên quan