Создать OpenSSL с RPATH?

У меня Ubuntu 14.04. Он поставляется с openssl 1.0.1f. Я хочу установить еще одну версию openssl (1.0.2), и я хочу ее самостоятельно скомпилировать.

Я настраиваю его следующим образом:

LDFLAGS='-Wl,--export-dynamic -L/home/myhome/programs/openssl/i/lib -L/home/myhome/programs/zlib/i/lib' CPPFLAGS='-I/home/myhome/programs/openssl/i/include -I/home/myhome/programs/zlib/i/include' ./config --prefix=/home/myhome/programs/openssl/i \ zlib-dynamic shared --with-zlib-lib=/home/myhome/programs/zlib/i/lib \ --with-zlib-include=/home/myhome/programs/zlib/i/include make make install 

После установки, когда я проверяю двоичный файл с помощью ldd openssl , результатом будет:

 ... libssl.so.1.0.0 => /home/myhome/programs/openssl/i/lib/libssl.so.1.0.0 (0x00007f91138c0000) libcrypto.so.1.0.0 => /home/myhome/programs/openssl/i/lib/libcrypto.so.1.0.0 (0x00007f9113479000) ... 

который выглядит хорошо. Но когда я проверяю ldd libssl.so , результат:

 ... libcrypto.so.1.0.0 => /lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007fac70930000) ... 

Он по-прежнему использует системную версию libcrypto. Я пробовал разные способы построения, но результат всегда остается прежним.

Мой вопрос заключается в том, как настроить сборку таким образом, чтобы она могла жестко кодировать все двоичные и библиотечные зависимости разделяемых библиотек, не используя LD_LIBRARY_PATH , или что-то в этом роде.

    Мой вопрос заключается в том, как настроить сборку таким образом, чтобы она могла жестко кодировать все двоичные и библиотечные зависимости разделяемых библиотек, не используя LD_LIBRARY_PATH , или что-то в этом роде.

    OpenSSL поддерживает RPATH из коробки для целей BSD (но не для других). From Configure:

     # 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[/]*$|); } 

    Самый простой способ сделать это для OpenSSL 1.0.2, похоже, добавить его как CFLAG :

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

    Следующий самый простой способ сделать это для OpenSSL 1.0.2 – это добавить строку Configure и hard code rpath . Например, я работаю над Debian x86_64. Поэтому я открыл файл Configure в редакторе, скопировал linux-x86_64 , назвал его linux-x86_64-rpath и сделал следующее изменение, чтобы добавить параметр -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", 

    Выше поля 2 и 6 были изменены. Они соответствуют $cflag и $ldflag в системе сборки OpenSSL.

    Затем настройте с новой конфигурацией:

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

    Наконец, после make , проверьте настройки:

     $ 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] 

    После выполнения make install ldd будет производить ожидаемые результаты:

     $ 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) ... 

    OpenSSL имеет компиляцию и установку в своей вики. Это теперь добавлено в wiki при сборке и установке | Использование RPATH

    Interesting Posts

    Есть ли общее ограничение, которое я мог бы использовать для оператора +?

    Является ли «структурное взлома» технически неопределенным поведением?

    Вызов функции стандартной библиотеки C из asm в Visual Studio

    Запрос Python, бросающий SSLError

    Это регулярное выражение не работает в c ++

    Компьютерный уход: спящий режим, спящий режим или выключение?

    Не удалось отправить SMS через код C #, используя System.IO.Ports, используя gsm-модем

    Получение сценариев .py для открытия в IDLE Python

    C #: список всех classов в сборке

    Как перенести / скопировать файлы cookie из одного браузера в другой или один и тот же браузер с одной машины на другую?

    Использование виджета NumberPicker со строками

    Программно добавить новый столбец в DataGridView

    Как очистить список переходов для удаленного рабочего стола?

    Бесплатная программа для автоматического обнаружения аппаратного обеспечения

    Каков максимальный размер для общего значения предпочтений Android?

    Давайте будем гением компьютера.