2014-01-18 40 views
1

當在嵌入式目標上使用openssl編譯時,需要減小nginx的大小。在嵌入式目標上使用openssl編譯時減少nginx大小

我能夠使用在http://wiki.nginx.org/InstallOptions中給出的步驟與ssl編譯nginx。它編譯得很好,但是我面臨的問題是,即nginx二進制文件將達到近6MB。

由於我必須在嵌入式目標上運行nginx,因此我嘗試了使用基於arm的電路板進行交叉編譯。我要進行交叉編譯,目標的規模將達到1.3MB。

如果我禁用openssl並將其編譯爲400KB,我認爲nginx會靜態鏈接openssl。

如果是這樣如何動態地將openssl包含到nginx中,因爲我的目標庫已經支持crypto和ssl庫。我嘗試了所有的選擇,但無法成功。

回答

2

如果是如何動態包括OpenSSL的nginx的

您需要與指定的OpenSSL:

--with-http_ssl_module 

上面的命令將針對如果有OpenSSL的共享對象的有效鏈接。

ngingx也可以建立OpenSSL,以便您:

--with-openssl 

我似乎記得一些問題--with-openssl(但我認爲他們有關FIPS有能力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-shared有很多麻煩)。


nginx的二進制來幾乎6MB。 ... ,目標的規模將達到1.3MB。

我不確定OpenSSL出現的大小有多小。以下可能(或可能不)進一步降低。

如果您編譯並鏈接到靜態存檔,那麼您也可以使用一些編譯器和鏈接器選項。具體而言,您可以使用gc-sections來丟棄未使用的功能:

--with-cc-opt="-ffunction-sections -fdata-sections" 
--with-ld-opt="-Wl,--gc-sections" 

您也有strip選項。您可以在最終的二進制運行strip -s或將其傳遞給鏈接器,雖然選擇:

--with-ld-opt="-Wl,-s" 

ld(1)--strip-debug--strip-all選項。

-Bsymbolic也可能有助於減少ELF節的大小(我認爲它可以是GOTPLT,但我現在不記得)。