在嵌入式目标上使用openssl编译时减少nginx大小

时间:2014-01-18 04:59:58

标签: nginx openssl arm

在嵌入式目标上使用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。我尝试了所有选项,但无法成功。

1 个答案:

答案 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部分的大小(我认为它是-BsymbolicGOT,但我现在不记得。)