在嵌入式目标上使用openssl编译时,我需要减小nginx的大小。
我可以使用http://wiki.nginx.org/InstallOptions中给出的步骤使用ssl编译nginx。它汇编得很好,但我面临的问题是它的大小,即nginx二进制文件几乎达到6MB。
由于我必须在嵌入式目标上运行nginx,我尝试使用基于arm的板进行交叉编译。我要交叉编译,目标的大小将达到1.3MB。
如果我禁用openssl并将其编译为400KB,我认为nginx是静态链接openssl。
如果是这样,如何动态地将openssl包含到nginx中,因为我的目标libs已经支持crypto和ssl libs。我尝试了所有选项,但无法成功。
答案 0 :(得分:2)
如果是这样,如何动态地将openssl包含到nginx
您需要使用以下命令指定OpenSSL:
--with-http_ssl_module
如果可用,上述命令将有效链接OpenSSL共享对象。
ngingx还可以为您构建OpenSSL:
--with-openssl
我似乎回想起--with-openssl
的一些问题(但我认为它们与FIPS Capable OpenSSL库有关)。
要某些链接到共享对象,您可以在nginx源上运行以下脚本:
OPENSSL_INSTALL_DIR=/usr/local/ssl
OPENSSL_LIB_DIR="$OPENSSL_INSTALL_DIR/lib"
...
for FILE in "auto/lib/sha1/conf" "auto/lib/md5/conf" "auto/lib/openssl/conf"
do
TFILE=`mktemp /tmp/fix.XXXXXXXXXX`
sed -e "s|-lssl|$OPENSSL_LIB_DIR/libssl.so|g" "$FILE" > "$TFILE"
mv "$TFILE" "$FILE"
TFILE=`mktemp /tmp/fix.XXXXXXXXXX`
sed -e "s|-lcrypto|$OPENSSL_LIB_DIR/libcrypto.so|g" "$FILE" > "$TFILE"
mv "$TFILE" "$FILE"
done
这将确保链接器链接特定的OpenSSL,而不仅仅是它找到的那个(我-L
,-l
,-static
和{我遇到了很多麻烦过去编译时{1}}。
nginx二进制文件接近6MB。 ... 并且目标的大小达到1.3MB。
我不确定OpenSSL存在的大小有多小。以下内容可能(或可能不会)进一步减少。
如果您编译并链接静态存档,那么您还可以使用一些编译器和链接器选项。具体来说,您可以使用-shared
:
gc-sections
您还有条带选项。您可以在最终二进制文件上运行--with-cc-opt="-ffunction-sections -fdata-sections"
--with-ld-opt="-Wl,--gc-sections"
或通过选项将其传递给链接器:
strip -s
请参阅ld(1)和--with-ld-opt="-Wl,-s"
以及--strip-debug
选项。
--strip-all
也可能有助于减少ELF部分的大小(我认为它是-Bsymbolic
或GOT
,但我现在不记得。)