2012-09-13 16 views
9

Mam plik wykonywalny, który niejawnie ładuje kilka bibliotek .so, wszystkie z nich zbudowane przeze mnie. Do wdrożenia lub przynajmniej testowania/debugowania, chciałbym mieć je wszystkie w tym samym katalogu:Jak zakodować plik wykonywalny na ścieżce Linux?

my_executable 
libmylib1.so 
libmylib2.so 

aby uzyskać plik wykonywalny, aby załadować biblioteki niejawnie, chciałbym ustawić rpath (DT_RUNPATH) dla katalogu wykonywalnego. Z OS X, zrobiłbym to tak:

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 

Zawiadomienie @loader_path/. który tworzy rpath wykonywalnego w OS X. Z Linuksem, najbliższa mogę dojść do tego jest

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 

Problem polega na tym, że w systemie Linux ścieżka rpath podąża za bieżącym katalogiem roboczym, a nie katalogiem wykonywalnym. Czy istnieje sposób na osiągnięcie tego samego w Linuksie?

Odpowiedz

6

Musisz użyć literalnego ciągu $ORIGIN jako ścieżki przebiegu, rozumianej jako lokalizacja pliku wykonywalnego przez dynamiczny program ładujący.

+0

To było to! Dziękuję Ci. –

2

Powszechnym rozwiązaniem jest utworzenie wrappera powłoki powłoki, który określa, w którym katalogu znajduje się plik wykonywalny i ustawia odpowiednio LD_LIBRARY_PATH przed wykonaniem rzeczywistego pliku wykonywalnego.

+3

Wspólne, ale brudne rozwiązanie, ludzie powinni dowiedzieć się o rpath – wich

Powiązane problemy