2012-09-13 33 views
9

Tôi có một tệp thực thi ngầm tải một số thư viện .so, tất cả chúng được xây dựng bởi tôi. Cho việc triển khai, hoặc ít nhất là thử nghiệm/gỡ lỗi, tôi muốn có tất cả trong cùng một thư mục:Làm thế nào để mã hóa vị trí thực thi trong một đường dẫn Linux?

my_executable 
libmylib1.so 
libmylib2.so 

Để có được thực thi để tải các thư viện ngầm, tôi muốn thiết lập một rPath (DT_RUNPATH) cho thư mục thực thi. Với OS X, tôi muốn làm điều này như sau:

clang -dynamiclib -o libmylib1.dylib -install_name @rpath/libmylib1.dylib src1.c src2.c  
clang -dynamiclib -o libmylib2.dylib -install_name @rpath/libmylib2.dylib src3.c src4.c 
clang -o my_executable -L. -llibmylib1.so -llibmylib2.so -Wl,-rpath,@loader_path/. main.c 

Thông báo các @loader_path/. hình thành rPath của thực thi trong OS X. Với Linux, gần nhất tôi có thể đến đây là

gcc -dynamiclib -o libmylib1.so src1.c src2.c  
gcc -dynamiclib -o libmylib2.so src3.c src4.c 
gcc -o my_executable -L. -llibmylib1.so -llibmylib2.so -Wl,-rpath=. main.c 

Các vấn đề ở đây là trên Linux, rpath theo sau thư mục làm việc hiện tại, chứ không phải thư mục thực thi. Có cách nào để hoàn thành điều tương tự trên Linux không?

Trả lời

6

Bạn cần sử dụng chuỗi chữ $ORIGIN làm đường chạy, được hiểu là vị trí thực thi của trình tải động.

+0

Đó là nó! Cảm ơn bạn. –

2

Một giải pháp phổ biến là tạo trình bao bọc tập lệnh shell để tìm ra thư mục nào có thể thực thi và đặt LD_LIBRARY_PATH một cách thích hợp trước khi thực thi thực thi thực tế.

+3

Một giải pháp phổ biến nhưng bẩn, mọi người nên tìm hiểu về rpath – wich

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