我花了一些时间在网上搜索,但我发现的内容似乎都没有帮助。
我正在运行 CentOS 6 64 位,想要使用 mod_ssl 编译 Apache,并且需要将其链接到我自己的 OpenSSL 版本(比操作系统提供的版本更新)。
OpenSSL 1.1.0i 配置为:
./config --prefix=/opt/openssl-1.1.0 --openssldir=/opt/openssl-1.1.0 shared
Apache 2.4 配置为:
./configure --enable-layout=mycustomlayout \
--prefix=/opt/httpd-2.4.34 \
--exec-prefix=/opt/httpd-2.4.34 \
--with-mpm=prefork \
--enable-so \
--enable-ssl \
--with-ssl=/opt/openssl-1.1.0 \
--enable-cgi \
--enable-http2 \
--enable-proxy-http2 \
--with-included-apr
它似乎编译得很好,但 mod_ssl 不知道 OpenSSL 1.1.0 安装在哪里:
[root@host .libs]# ldd ./mod_ssl.so | grep -iP 'ssl|crypto'
libssl.so.1.1 => not found
libcrypto.so.1.1 => not found
所以只有当你明确告诉它去哪里看时才有效:
[root@host .libs]# export LD_LIBRARY_PATH=/opt/openssl-1.1.0/lib:$LD_LIBRARY_PATH
[root@host .libs]# ldd ./mod_ssl.so | grep -iP 'ssl|crypto'
libssl.so.1.1 => /opt/openssl-1.1.0/lib/libssl.so.1.1 (0x00007f069149a000)
libcrypto.so.1.1 => /opt/openssl-1.1.0/lib/libcrypto.so.1.1 (0x00007f069100a000)
即使将 mod_ssl 静态构建到 httpd 二进制文件中也--enable-mods-static=ssl
没有帮助。
我尝试了--enable-ssl
、--enable-ssl --enable-ssl-staticlib-deps
、 和 ,--enable-ssl --enable-ssl-staticlib-deps --enable-mods-static=ssl
结果仍然相同:
libssl.so.1.1 => not found
libcrypto.so.1.1 => not found
还尝试过,但没有运气,之前设置这些变量./configure
:
export PKG_CONFIG_PATH=/opt/openssl-1.1.0/lib/pkgconfig:$PKG_CONFIG_PATH \
LD_LIBRARY_PATH=/opt/openssl-1.1.0/lib:$LD_LIBRARY_PATH \
LDFLAGS="-L/opt/openssl-1.1.0/lib"
我知道我可以添加到/etc/ld.so.conf.d
自动加载新的 OpenSSL 库或调整 Apache 的初始化脚本来添加,LD_LIBRARY_PATH
但我更希望让它正常工作,让程序在哪里查找libssl.so
/ libcrypto.so
,就像我的 PHP 构建一样:
[root@host php]# export PKG_CONFIG_PATH=/opt/openssl-1.1.0/lib/pkgconfig:$PKG_CONFIG_PATH \
LD_LIBRARY_PATH=/opt/openssl-1.1.0/lib:$LD_LIBRARY_PATH \
LDFLAGS="-L/opt/openssl-1.1.0/lib" \
PHP_PREFIX=/opt/php-7.2.9 \
EXTENSION_DIR=$PHP_PREFIX/usr/lib64/php/modules
[root@host php]# ./configure […] \
--with-imap=shared \
--with-imap-ssl \
--with-openssl=shared \
--with-openssl-dir=/opt/openssl-1.1.0/bin
[root@host php]# make
[root@host php]# unset PKG_CONFIG_PATH LD_LIBRARY_PATH LDFLAGS
[root@host modules]# ldd ./openssl.so | grep -iP 'ssl|crypto'
libssl.so.1.1 => /opt/openssl-1.1.0/lib/libssl.so.1.1 (0x00007fc2220a6000)
libcrypto.so.1.1 => /opt/openssl-1.1.0/lib/libcrypto.so.1.1 (0x00007fc221c17000)
我究竟做错了什么?这可能是一个错误吗?
答案1
尝试将以下内容添加到 LDFLAGS 环境变量中:
-Bstatic -lssl -lcrypto
.so
另外,请确保openssl libdir 上没有任何文件,只有静态.a
文件。理想情况下,可以通过将no-shared
参数传递给 openssl 配置来完成。
./configure
我仍然不确定为什么有时链接器仍然更喜欢共享版本(如果存在),即使我们明确要求静态版本,但可能与httpd 中的脚本处理库依赖关系的方式有关。
虽然配置脚本上的补丁可能会更干净,但仅仅没有.so
文件似乎就足以让链接器选择静态版本。