2015-05-08 7 views
1

Я пытаюсь поставить статическую ссылку OpenSSL в свою программу.Связывание OpenSSL с динамической библиотекой

Он отлично работает при подключении к исполняемому файлу. Мне нужно использовать OpenSSL в общей библиотеке (так, или dll), которую я динамически загружаю позже, когда процесс выполняется.

Попытка статически связать OpenSSL с общей библиотекой вызывает ошибки из-за того, что OpenSSL не скомпилирован с -fPIC. Можно ли это сделать без перекомпиляции openssl?

Кроме того, есть ли лучший способ сделать это?

+0

Если вам нужно статической ссылке, вы, возможно, придется скомпилировать его самостоятельно. – tadman

+0

Вам нужно снова скомпилировать файлы .so. – Prabhu

ответ

1

Я пытаюсь поставить статическую ссылку OpenSSL в свою программу.

В этом случае, его так просто, как:

gcc prog.c /usr/local/lib/libssl.a /usr/local/lib/libcrypto.a -o prog.exe -ldl 

Он отлично работает при связывании в исполняемый файл.

Адвокат дьявола ... Сработает ли он с независимым кодом положения (PIE)? PIE в программе эквивалентен PIC на общем объекте (некоторые отказываются от руки).

gcc -fPIE prog.c /usr/local/lib/libssl.a /usr/local/lib/libcrypto.a -o prog.exe -ldl 

Согласно ССАГПЗ людей, вы можете скомпилировать с fPIC, а затем построить общий объект с -fPIC или перемещаемый исполняемый файл с -fPIE. То есть, его ОК использовать -fPIC для обоих.


Попытка статически OpenSSL в общей библиотеке приводит к ошибкам из-за OpenSSL не компилируется с -fPIC.

Это достаточно легко исправить. Вы просто указываете shared в Configure:

./config shared no-ssl2 no-ssl3 no-comp --openssldir=/usr/local/ssl 
make 
sudo make install 

Я думаю вы можете также (обратите внимание на отсутствие shared):

export CFLAGS="-fPIC" 
./config no-ssl2 no-ssl3 no-comp --openssldir=/usr/local/ssl 
make 
sudo make install 

не компилируется с -fPIC. Можно ли это сделать без перекомпиляции openssl?

НЕТ, вы должны скомпилировать с ПОС, чтобы гарантировать, что GCC создает перемещаемый код.


Кроме того, есть лучший способ сделать это?

Обычно вы настраиваете только shared. Это вызывает -fPIC, что дает вам перемещаемый код.

Есть другие вещи, которые вы можете сделать, но они более навязчивы. Например, вы можете изменить линию Configure (например, linux-x86_64) и добавить -fPIC во второе поле. Поля разделяются двоеточиями, а второе поле - $cflags, используемое системой сборки OpenSSL.

Вы можете увидеть пример изменения Configure на Build OpenSSL with RPATH?