openssl交叉编译(这次基本上正规了)
初级代码游戏的专栏介绍与文章目录-CSDN博客
我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。
这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。
源码指引:github源码指引_初级代码游戏的博客-CSDN博客
此示例用的是openssl-1.1.1k.tar.gz,不过方法应该各个版本都适用(同样的方法也用在了最新的4.3版上)。交叉编译工具链用的是arm官方交叉编译工具,我用过不同的交叉编译工具链,结果发现官方的最好用。
目录
源码包上传
配置(自动)./config
查看支持的系统./Configure(不带参数)
配置系统./Configure(带参数)
主要编译参数说明
--cross-compile-prefix=PREFIX
--prefix=DIR
--openssldir=DIR
多说两句
源码包上传
tar -xvf openssl-1.1.1k.tar.gz
cd openssl-1.1.1k
检查一下有没有libssl.so在目录树里面:“find . -name libssl.so*”,输出应该是空的。
配置(自动)./config
./config
这是自动检测系统,不能做交叉编译(除非整个环境都配置为交叉编译)。
所以我们不用这个。
配置完成后生成Makefile,然后就可以像通常那样编译和安装了:
make
make test
make install
查看支持的系统./Configure(不带参数)
openssl已经支持很多系统,配置好了需要的参数,所以尽量用已经支持的,不要自己去修改。查看支持的系统:
./Configure
输出是支持的系统列表:
root@debian:~/src/openssl-1.1.1k# ./Configure
Usage: Configure [no-<cipher> ...] [enable-<cipher> ...] [-Dxxx] [-lxxx] [-Lxxx] [-fxxx] [-Kxxx] [no-hw-xxx|no-hw] [[no-]threads] [[no-]shared] [[no-]zlib|zlib-dynamic] [no-asm] [no-egd] [sctp] [386] [--prefix=DIR] [--openssldir=OPENSSLDIR] [--with-xxx[=vvv]] [--config=FILE] os/compiler[:flags]
pick os/compiler from:
BS2000-OSD BSD-generic32 BSD-generic64 BSD-ia64 BSD-sparc64 BSD-sparcv8
BSD-x86 BSD-x86-elf BSD-x86_64 Cygwin Cygwin-i386 Cygwin-i486 Cygwin-i586
Cygwin-i686 Cygwin-x86 Cygwin-x86_64 DJGPP MPE/iX-gcc UEFI UWIN VC-CE VC-WIN32
VC-WIN32-ARM VC-WIN32-ONECORE VC-WIN64-ARM VC-WIN64A VC-WIN64A-ONECORE
VC-WIN64A-masm VC-WIN64I aix-cc aix-gcc aix64-cc aix64-gcc android-arm
android-arm64 android-armeabi android-mips android-mips64 android-x86
android-x86_64 android64 android64-aarch64 android64-mips64 android64-x86_64
bsdi-elf-gcc cc darwin-i386-cc darwin-ppc-cc darwin64-arm64-cc darwin64-ppc-cc
darwin64-x86_64-cc gcc haiku-x86 haiku-x86_64 hpux-ia64-cc hpux-ia64-gcc
hpux-parisc-cc hpux-parisc-gcc hpux-parisc1_1-cc hpux-parisc1_1-gcc
hpux64-ia64-cc hpux64-ia64-gcc hpux64-parisc2-cc hpux64-parisc2-gcc hurd-x86
ios-cross ios-xcrun ios64-cross ios64-xcrun iossimulator-xcrun iphoneos-cross
irix-mips3-cc irix-mips3-gcc irix64-mips4-cc irix64-mips4-gcc linux-aarch64
linux-alpha-gcc linux-aout linux-arm64ilp32 linux-armv4 linux-c64xplus
linux-elf linux-generic32 linux-generic64 linux-ia64 linux-mips32 linux-mips64
linux-ppc linux-ppc64 linux-ppc64le linux-sparcv8 linux-sparcv9 linux-x32
linux-x86 linux-x86-clang linux-x86_64 linux-x86_64-clang linux32-s390x
linux64-mips64 linux64-s390x linux64-sparcv9 mingw mingw64 nextstep
nextstep3.3 sco5-cc sco5-gcc solaris-sparcv7-cc solaris-sparcv7-gcc
solaris-sparcv8-cc solaris-sparcv8-gcc solaris-sparcv9-cc solaris-sparcv9-gcc
solaris-x86-gcc solaris64-sparcv9-cc solaris64-sparcv9-gcc solaris64-x86_64-cc
solaris64-x86_64-gcc tru64-alpha-cc tru64-alpha-gcc uClinux-dist
uClinux-dist64 unixware-2.0 unixware-2.1 unixware-7 unixware-7-gcc vms-alpha
vms-alpha-p32 vms-alpha-p64 vms-ia64 vms-ia64-p32 vms-ia64-p64 vos-gcc
vxworks-mips vxworks-ppc405 vxworks-ppc60x vxworks-ppc750 vxworks-ppc750-debug
vxworks-ppc860 vxworks-ppcgen vxworks-simlinux
NOTE: If in doubt, on Unix-ish systems use './config'.
大部分情况我们是为arm交叉编译,所需的系统类型参数是“linux-armv4”和“linux-aarch64”。
配置系统./Configure(带参数)
./Configure linux-armv4 --cross-compile-prefix=/root/gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
配置为arm32位系统,第一个参数为系统类型,第二个参数为交叉编译工具链前缀(取决于你的工具链安装位置和名称),输出:
Configuring OpenSSL version 1.1.1k (0x101010bfL) for linux-armv4
Using os-specific seed configuration
Creating configdata.pm
Creating Makefile
**********************************************************************
*** ***
*** OpenSSL has been successfully configured ***
*** ***
*** If you encounter a problem while building, please open an ***
*** issue on GitHub <https://github.com/openssl/openssl/issues> ***
*** and include the output from the following command: ***
*** ***
*** perl configdata.pm --dump ***
*** ***
*** (If you are new to OpenSSL, you might want to consult the ***
*** 'Troubleshooting' section in the INSTALL file first) ***
*** ***
**********************************************************************
注意最上面一行“Configuring OpenSSL version 1.1.1k (0x101010bfL) for linux-armv4” ,然后就可以用make编译了。
编译结果就在当前目录下,用file检查文件类型:
root@debian:~/src/openssl-1.1.1k# ls
ACKNOWLEDGEMENTS build.info configdata.pm crypto e_os.h include libcrypto.pc libssl.map LICENSE NOTES.ANDROID NOTES.VMS README test
apps CHANGES Configurations demos external INSTALL libcrypto.so libssl.pc Makefile NOTES.DJGPP NOTES.WIN README.ENGINE tools
appveyor.yml config Configure doc FAQ libcrypto.a libcrypto.so.1.1 libssl.so ms NOTES.PERL openssl.pc README.FIPS util
AUTHORS config.com CONTRIBUTING engines fuzz libcrypto.map libssl.a libssl.so.1.1 NEWS NOTES.UNIX os-dep ssl VMS
root@debian:~/src/openssl-1.1.1k# file libssl.so.1.1 libcrypto.so.1.1
libssl.so.1.1: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=5ee86f9d91497d1ff2beec6250df479b9805c44c, with debug_info, not stripped
libcrypto.so.1.1: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=c6a762c6f2cc50e686ea4d9c5a4bb67d808a2763, with debug_info, not stripped
“ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV)”,这说明确实是交叉编译出来的结果。
主要编译参数说明
这些参数同时适用于config和Configure。
--cross-compile-prefix=PREFIX
这个前面已经用到了,是交叉编译工具链的前缀,默认编译器是gcc,加了这个前缀就成了“/root/gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc”(按照前面的设置),ar也是如此,编译相关的几个命令都加上了这个前缀。
如果一个特定的交叉编译环境已经把CC设置成了交叉编译工具(专用的交叉编译工具一般如此,而我用的这个是arm官网提供的标准交叉编译工具),则不需要使用这个参数。
这个参数也可以用环境变量CROSS_COMPILE代替。命令行参数会覆盖环境变量设置。
--prefix=DIR
安装路径,交叉编译无所谓,反正只要两个so或a就行了。
make install将把输出复制到安装路径。
--openssldir=DIR
运行时使用的配置和默认证书、密钥的存放位置。一般也不关心这个。
多说两句
如果需要修改生成的Makefile一般还是参数或交叉编译工具设置有问题,用标准交叉编译工具可以减少此类问题(如果可以的话)。很多时候出问题还是文档没吃透。
为了编译更快可以用“make -j4”,4代表4个任务并行,可以设置为和CPU核数相同。
如果编译出错,为了查看编译参数到底有什么问题,你可能非常需要“make VERBOSE=1”,VERBOSE=1将打开命令回显,这样就可以仔细分析是哪个头文件目录没包含还是哪个库没有链接。如果是cmake,需要在cmake 时加上“-DCMAKE_VERBOSE_MAKEFILE=ON”,这样生成的makefile就会包含“VERBOSE=1”。
(这里是文档结束)