2012-02-22 11 views
6

I zostały próbuje skompilować openssl 1.0.0g z następującym rPath:Jak skompilować OpenSSL stosunkowo rPath

$ORIGIN/../lib64 

Everytime I readelf -d apps/openssl, jestem coraz wyniki, jak poniżej, w zależności od tego, co Cytowanie zmienność Próbowałam :

\RIGIN/../lib64 
RIGIN/../lib64 
ORIGIN/../lib64 

Chcę ustawić moje rpath bez korzystania z zewnętrznych narzędzi, takich jak chrpath. Czy to w ogóle możliwe? Zasadniczo przyjmuję wszystko, co nie wymaga użycia zewnętrznych narzędzi, takich jak chrpath (chociaż już to zrobiłem).

Idealnie, chciałbym to zrobić, przekazując opcje w linii poleceń (dowolna forma -Wl,-rpath,$ORIGIN/../lib64).

Nie mam nic przeciwko edycji wygenerowanego pliku Makefile, który starałem się ostatnio. Gdybym tylko mógł go wydrukować głupi znak dolara !!! Próbowałem modyfikować LIBRPATH w bloku BUILDENV = bez powodzenia. Moje najlepsze wyniki do tej pory:

LIBRPATH=$$'ORIGIN/../lib64 # result: /../lib64 
LIBRPATH=$$$$'ORIGIN/../lib64 # result: 12345<pid>/../lib64 

Czytałem różne pytania związane rpath i próbował ucieczki i cytowanie różnych sztuczek, ale nic nie działało tak daleko!

Odpowiedz

7

W swojej próbie makefile:

-Wl,-rpath,${ORIGIN}/../lib64 

jestem przy założeniu, że POCHODZENIE jest zmienną powłoki.

EDIT

Mam tylko znaleźć odpowiedź na swoje pytanie (lepiej późno wtedy nigdy): Trzeba zapobiec zrobić ze zmiennych interpolujących, aby to zrobić trzeba użyć $$ (podwójna dolar sign):

-Wl,-rpath,'$$ORIGIN/../lib64' 

wiem, że to działa, bo testowałem to z własnej aplikacji, cieszyć :)

+0

To nie jest i jest to częścią całego problemu. Potrzebuję napisu "ORIGIN /../ lib64" do napisania w pliku wykonywalnym. Nie może być żadnej zamiany. –

+0

Czy możesz wyjaśnić, z której wersji programu openssl korzystasz i jaka linia pliku Makefile zmieniłeś? –

+0

OpenSSL ma plik 'Makefile.org' i kilka rekurencyjnych plików Makefile. I nie honorują 'CFLAGS',' LDFLAGS', itd. Więc * "W twoim makefile try ..." * jest * nie * tak proste, jak się wydaje. – jww

2

poszedłem sposób chrpath. http://enchildfone.wordpress.com/2010/03/23/a-description-of-rpath-origin-ld_library_path-and-portable-linux-binaries/

Jest dość skomplikowane, aby przeciwdziałać ekspansji powłoki `$$ ORIGIN`` w openssl. Prędzej czy później zostanie on rozszerzony ze względu na znak dolara. Jeśli naprawdę chcesz iść tą drogą, możesz to zrobić. Znalazłem następujące do pracy z openssl 1.0.1g na Linux. W Makefile.shared, poszukaj tej linii:

DO_GNU_APP=LDFLAGS="$(CFLAGS) -Wl,-rpath,$(LIBRPATH)" 

Wymień go na następujący. Ten quoting-fu neutralizuje ekspansję $. Podwójny $$ jest sposobem na uzyskanie pojedynczego znaku dolara w plikach makefile.

DO_GNU_APP=LDFLAGS="$(CFLAGS) -Wl,-rpath,'"'$$'"ORIGIN/../lib64'" 

Po kompilacji:

readelf -d apps/openssl | grep RPATH 
0x000000000000000f (RPATH)    Library rpath: ['$ORIGIN/../lib64'] 
+0

'DO_GNU_APP = LDFLAGS ...' - Ja * myślę, że to pozwoli 'libssl.so' nadal ładować nieprawidłowe' libcrypto.so'. – jww

+0

*** Plus One *** ... udało ci się uzyskać względną RPATH * z * zmienną powłoki. Czy 'ldd' honoruje zmienną powłoki? Czy rozszerza się? Zamierzam zakodować to pytanie, ponieważ nigdy wcześniej tego nie widziałem ... – jww

+0

$ ORIGIN to specjalny token LDS. Źle wybrana, jeśli mnie pytasz, ponieważ znak dolara jest specjalną postacią, która zostaje rozszerzona przez pociski, jeśli nie przez pliki makefile. Dlatego tak trudno jest włożyć $ ORIGIN do pliku wykonywalnego. Łatwiej jest użyć chrpath. Ten rodzaj względnej ścieżki powoduje, że twoja lokalizacja jest niezależna i pozwala zachować wiele wersji w różnych lokalizacjach. –

0

Nie przeszkadza edycji wygenerowany Makefile, który jest co staram ostatni ...

Nie jestem pewien, czy można ustawić go ze zmienną powłoki i ścieżką względną. I nie wymyślić rozszerza $ORIGIN w $ORIGIN/../lib64. W tym przypadku, myślę, że musisz użyć ldconfig do dodać$ORIGIN/../lib64 do ścieżek wyszukiwania biblioteki. Zobacz finding ldd search path w witrynie Server Fault, aby uzyskać więcej informacji.

Ponieważ nie jestem pewien, dostarczę instrukcje tak. Nie musisz zmieniać plików Makefile. W rzeczywistości nie miałem szczęścia w przeszłości, ponieważ rzeczy zostały nadpisane, a inne rzeczy, takie jak CFLAGS i LDFLAGS, zostały zignorowane.

Zobacz także Build OpenSSL with RPATH? Twoje pytanie i cytowane pytanie to inne pytanie, które zbliża się do podobnych odpowiedzi (bez duplikacji między nimi). Ale zapewnia pozycję programisty OpenSSL na RPATH. To był prywatny adres e-mail, więc udostępniłem odpowiednie informacje, a nie całą wiadomość.

Jeśli uda Ci się osadzić $ORIGIN/../lib64 w sekcji ELF i zadziała, to zgłoś to. Poniżej używam /usr/local/ssl/lib dla mojego RPATH. Powinieneś zastąpić $ORIGIN/../lib64 dla /usr/local/ssl/lib.


OpenSSL obsługuje RPATH „s po wyjęciu z pudełka dla celów BSD (ale nie innych). Od Configure pojawia

# Unlike other OSes (like Solaris, Linux, Tru64, IRIX) BSD run-time 
# linkers (tested OpenBSD, NetBSD and FreeBSD) "demand" RPATH set on 
# .so objects. Apparently application RPATH is not global and does 
# not apply to .so linked with other .so. Problem manifests itself 
# when libssl.so fails to load libcrypto.so. One can argue that we 
# should engrave this into Makefile.shared rules or into BSD-* config 
# lines above. Meanwhile let's try to be cautious and pass -rpath to 
# linker only when --prefix is not /usr. 
if ($target =~ /^BSD\-/) 
    { 
    $shared_ldflag.=" -Wl,-rpath,\$(LIBRPATH)" if ($prefix !~ m|^/usr[/]*$|); 
    } 

Najłatwiej zrobić to za OpenSSL 1.0.2 byćadd it to linker flags during configuration

./config -Wl,-rpath=/usr/local/ssl/lib 

Można również edytować Konfiguracja linii i twarde kod rpath. Na przykład pracuję nad Debianem x86_64. Więc otworzyłem plik Configure w edytorze, kopiowane linux-x86_64 nazwie to linux-x86_64-rpath i złożył następujące zmiany dodać opcję -rpath:

"linux-x86_64-rpath", "gcc:-m64 -DL_ENDIAN -O3 -Wall -Wl,-rpath=/usr/local/ssl/lib:: 
-D_REENTRANT::-Wl,-rpath=/usr/local/ssl/lib -ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL: 
${x86_64_asm}:elf:dlfcn:linux-shared:-fPIC:-m64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::64", 

Powyżej pola 2 i 6 zostały zmienione. Odpowiadają one $cflag i $ldflag w systemie kompilacji OpenSSL.

Następnie należy skonfigurować z nową konfiguracją:

$ ./Configure linux-x86_64-rpath shared no-ssl2 no-ssl3 no-comp \ 
    --openssldir=/usr/local/ssl enable-ec_nistp_64_gcc_128 

Wreszcie, po make, zweryfikować ustawienia zatrzymany:

$ readelf -d ./libssl.so | grep -i rpath 
0x000000000000000f (RPATH)    Library rpath: [/usr/local/ssl/lib] 
$ readelf -d ./libcrypto.so | grep -i rpath 
0x000000000000000f (RPATH)    Library rpath: [/usr/local/ssl/lib] 
$ readelf -d ./apps/openssl | grep -i rpath 
0x000000000000000f (RPATH)    Library rpath: [/usr/local/ssl/lib] 

Po wykonać make install, następnie ldd przyniesie oczekiwanych rezultatów :

$ ldd /usr/local/ssl/lib/libssl.so 
    linux-vdso.so.1 => (0x00007ffceff6c000) 
    libcrypto.so.1.0.0 => /usr/local/ssl/lib/libcrypto.so.1.0.0 (0x00007ff5eff96000) 
    ... 

$ ldd /usr/local/ssl/bin/openssl 
    linux-vdso.so.1 => (0x00007ffc30d3a000) 
    libssl.so.1.0.0 => /usr/local/ssl/lib/libssl.so.1.0.0 (0x00007f9e8372e000) 
    libcrypto.so.1.0.0 => /usr/local/ssl/lib/libcrypto.so.1.0.0 (0x00007f9e832c0000) 
    ...