Docker容器交叉编译zlib/OpenSSL到armv7遇libz.so格式错误
解决Docker容器中ARM交叉编译zlib与OpenSSL的格式不兼容问题
在Docker Linux容器中交叉编译zlib、OpenSSL时,曾遇到错误:
/usr/local/zlib/lib/libz.so: file not recognized: file format not recognized
执行file /usr/local/zlib/lib/libz.so输出:
/usr/local/zlib/lib/libz.so: symbolic link to libz.so.1.2.13
最初失败的编译脚本
# installing zlib wget $WGET_URL/zlib-1.2.13.tar.gz -O /tmp/zlib.tar.gz -q && \ mkdir /tmp/zlib && \ tar -xvf /tmp/zlib.tar.gz -C /tmp/zlib && \ rm -rf zlib.tar.gz && \ cd /tmp/zlib/*/ && \ CHOST=arm && \ CC=/usr/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc && \ AR=/usr/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-ar && \ RANLIB=/usr/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-ranlib && \ ./configure --prefix=/usr/local/zlib && \ make clean && \ make install && \ cd /tmp && \ rm -r -f /tmp/zlib && \ # installing openssl wget $WGET_URL/openssl-3.0.7.tar.gz -O /tmp/openssl.tar.gz -q && \ mkdir /tmp/openssl && \ tar -xvf /tmp/openssl.tar.gz -C /tmp/openssl && \ rm -rf openssl.tar.gz && \ cd /tmp/openssl/*/ && \ ./config linux-generic32 -DL_ENDIAN --prefix=/usr/local/openssl \ --with-zlib-include=/usr/local/zlib/include \ --with-zlib-lib=/usr/local/zlib/lib shared zlib && \ make CC=/usr/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc \ LD=/usr/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc \ MAKEDEPPROG=arm-linux-gnueabihf-gcc PROCESSOR=ARM && \ make install CC=/usr/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc \ LD=/usr/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc \ MAKEDEPPROG=arm-linux-gnueabihf-gcc PROCESSOR=ARM
成功的编译脚本
# installing zlib wget $WGET_URL/zlib-1.2.13.tar.gz -O /tmp/zlib.tar.gz -q && \ mkdir /tmp/zlib && \ tar -xvf /tmp/zlib.tar.gz -C /tmp/zlib && \ rm -rf zlib.tar.gz && \ cd /tmp/zlib/*/ && \ CROSS_PREFIX=/usr/arm-linux-gnueabihf/bin/arm-linux-gnueabihf- && \ ./configure --prefix=/usr/arm/zlib && \ make clean && \ make && \ make install && \ cd /tmp && \ rm -r -f /tmp/zlib && \ # installing openssl wget $WGET_URL/openssl-1.0.1c.tar.gz -O /tmp/openssl.tar.gz -q && \ mkdir /tmp/openssl && \ tar -xvf /tmp/openssl.tar.gz -C /tmp/openssl && \ rm -rf openssl.tar.gz && \ cd /tmp/openssl/*/ && \ ./Configure linux-generic32 shared -DL_ENDIAN --prefix=/usr/arm/openssl \ --openssldir=/usr/arm/openssl && \ make CC=/usr/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc \ RANLIB=/usr/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc-ranlib \ LD=/usr/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc-ld \ MAKEDEPPROG=/usr/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc PROCESSOR=ARM && \ make install_sw CC=/usr/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc \ RANLIB=/usr/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc-ranlib \ LD=/usr/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc-ld \ MAKEDEPPROG=/usr/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc PROCESSOR=ARM && \ cd /tmp && \ rm -r -f /tmp/openssl
关键修改说明
- zlib编译:通过
CROSS_PREFIX指定交叉编译工具链前缀,确保生成ARM架构的库文件,而非主机x86架构 - OpenSSL配置:改用
./Configure而非./config,更适配交叉编译场景;同时调整版本为1.0.1c,避免高版本的兼容性问题 - 工具链参数:明确指定所有交叉编译工具(CC、RANLIB、LD等)的完整路径,确保编译过程调用正确的ARM工具链
- 安装方式:OpenSSL使用
make install_sw替代默认安装,避免生成不必要的文档或示例组件
内容的提问来源于stack exchange,提问作者bkepley
相关产品推荐
相关产品推荐

