Я пытаюсь поставить статическую ссылку 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?
Если вам нужно статической ссылке, вы, возможно, придется скомпилировать его самостоятельно. – tadman
Вам нужно снова скомпилировать файлы .so. – Prabhu