项目审查发现OpenSSL1.0.2d有漏洞,所以需要升级更新OpenSSL版本,借此机会,记录一下编译OpenSSL静态库的流程。
Xcode使用的是14.2,OpenSSL使用的是1.0.2u、1.1.1u,由于是对两个不同版本进行的编译操作,所以相关命令和操作方式是有区别的,我会在下面分别描写,操作时要看清对应的步骤,以防编译出的包有问题。
第一步:
打开OpenSSL官网/source/index.html,找到GitHub地址:https://github.com/openssl/openssl,并下载对应版本的源码到本地。
注意:源码是有很多分支和tag的,如果是替换,最好是选择同一个版本下的源码,否则编出的静态库,替换后很有可能会报错,找不到对应头文件或者相关方法。
第二步:
1、如果你使用的是OpenSSL-1.0.2u源码:
解压文件,打开源码文件夹的终端窗口,创建文件夹,执行命令:
mkdir openssl_armv7
此时会在源码目录中生成对应的文件夹,如图所示:
2、如果你使用的是OpenSSL-1.1.1u源码:
解压文件,打开源码文件夹的终端窗口,创建文件夹,执行命令:
mkdir openssl_arm64 openssl_armv7 openssl_x86_64 openssl_lib
此时会在源码目录中生成对应的文件夹,如图所示:
注意:
iPhoneOS真机架构:arm64、armv7、armv7s
iPhoneSimulator模拟器架构:x84_64、i386
因为我之前的静态库是支持arm64、armv7、x86_64的,所以这里也只是对这些架构进行的操作,其他的应该也能同理使用。
第三步:
生成配置文件,执行命令:
# no-asm:不使用arm指令集
# 其实这个值,我也比较模糊,no-asm是在交叉编译过程中不使用汇编代码,加速编译过程,原因是它的汇编代码是对arm格式不支持的,但是我在编译arm64、armv7时也是没有问题的,有点奇怪。
# -shared:编译动态库和静态库
# no-shared:只编译静态库./Configure iphoneos-cross no-asm no-shared --prefix=(刚才生成的文件夹地址,可以将文件夹直接拖拽到此处,直接生成地址)
此时会在源码文件夹下生成Makefile文件,如图所示:
第四步:
打开Makefile文件,修改CC=、CFLAG(S)= 参数,添加CROSS_TOP、CROSS_SDK参数值;
注意、注意、注意:如果想要生成的是模拟器架构:x84_64、i386,要记的将iPhoneOS全部替换成iPhoneSimulator
1、如果你使用的是OpenSSL-1.0.2u源码:
# 找到CC= llvm-gcc,替换以下代码:参数值其实是Xcode中clang指令的地址
CC= /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch armv7(写入对应的指令集arm64/armv7/x86_64等)# 接着上面的参数,向下一两行,找到CFLAG=,在此参数上添加CROSS_TOP 和 CROSS_SDK
CROSS_TOP=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer # Xcode下iPhoneOS平台地址
CROSS_SDK=iPhoneOS.sdk # iPhoneOS平台下的sdk# 作为iOS开发,上面的地址应该很熟悉,很容易的就能找到
2、如果你使用的是OpenSSL-1.1.1u源码:
# 找到CC= $(CROSS_COMPILE)cc,替换以下代码:参数值其实是Xcode中clang指令的地址
CC= /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch armv7(写入对应的指令集arm64/armv7/x86_64等)# 接着上面的参数,向下一两行,找到CFLAGS=-O3,替换以下代码:
# Xcode下iPhoneOS平台地址
CROSS_TOP=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer
# iPhoneOS平台下的sdk
CROSS_SDK=iPhoneOS.sdk
# 配置地址
CFLAGS=-DDSO_DLFCN -DHAVE_DLFCN_H -DNDEBUG -DOPENSSL_THREADS -DOPENSSL_NO_STATIC_ENGINE -DOPENSSL_PIC -DOPENSSLDIR="\"$(OPENSSLDIR)\"" -DENGINESDIR="\"$(ENGINESDIR)\"" -O3 -D_REENTRANT -isysroot $(CROSS_TOP)/SDKs/$(CROSS_SDK) -fno-common
第五步:
将Makefile配置完成后,执行命令:
make
然后会在源码文件夹下生成libssl.a、libcrypto.a,如图所示:
OpenSSL-1.0.2u:
OpenSSL-1.1.1u:
第六步:
此时会发现之前创建的架构文件夹还是空的,没有任何东西,此时执行命令:
make install
执行完成后,再查看对应的文件夹,会发现东西已经生成完成,如图所示:
OpenSSL-1.0.2u:
OpenSSL-1.1.1u:
第七步:
1、如果你使用的是OpenSSL-1.0.2u源码:
此时一个架构对应的libssl.a、libcrypto.a静态库和头文件已经生成,此时你需要把对应的架构文件夹,如openssl_arm64,放到一个自定义的文件夹下,当然也可以直接放到源码文件夹的上层文件夹下,然后删除源码文件夹,重新解压下载的OpenSSL源码压缩包,开始编译其他架构下的静态库,从第二步开始执行,一定要注意修改对应的架构名称,一定要注意修改对应的架构名称,一定要注意修改对应的架构名称,重要的事说三遍!!!(记得要把生成的静态库都放在同一个文件夹下)
2、如果你使用的是OpenSSL-1.1.1u源码:
执行命令:
make clean
然后从第三步开始编译其他架构下的静态库,一定要注意修改对应的架构名称,一定要注意修改对应的架构名称,一定要注意修改对应的架构名称,重要的事说三遍!!!
最后,当所有架构的静态库都已经生成完成后,我们需要将不同的libssl.a、libcrypto.a生成同一个.a库,在和各个架构文件夹同级的目录下创建一个输出文件夹,如:openssl_lib,打开上级文件夹的终端窗口,执行命令:
# 合并libssl.a
lipo -create openssl_arm64/lib/libssl.a openssl_armv7/lib/libssl.a openssl_x86_64/lib/libssl.a -output openssl_lib/libssl.a # 合并libcrypto.a
lipo -create openssl_arm64/lib/libcrypto.a openssl_armv7/lib/libcrypto.a openssl_x86_64/lib/libcrypto.a -output openssl_lib/libcrypto.a
这样就会在openssl_lib文件夹下生成两个合并好的libssl.a、libcrypto.a,打开openssl_lib文件夹下的终端窗口,查看合并的架构信息:
# 查看合并的架构信息
lipo -info libcrypto.a
lipo -info libssl.a
如图所示:
此时将任意一个架构文件夹中的include文件夹添加到openssl_lib文件夹下,这样一个完整的OpenSSL静态库就生成了!如图所示:
关于使用脚本代码编译OpenSSL静态库的方式,暂时没有可用的办法,如果后续研究出来,会继续记录,供大家参考。
OK,以上信息已经整理完毕,整理不易,转载请注明,谢谢~