iOS开发之编译OpenSSL静态库

项目审查发现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,以上信息已经整理完毕,整理不易,转载请注明,谢谢~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/80270.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux服务器部署常用命令记录【持续更新】

介绍:最近服务器被人频繁攻击,留下一堆垃圾文件。重装后需要重新部署,才发现Linux的命令怎么这么碎。于是乎就产生了写这篇文章的想法。本文旨在记录常用的Linux部署需要使用的命令,另一篇关于Linux docker安装常用软件的文章&…

HTTP响应详解, HTTP请求构造及HTTPS详解

HTTP响应详解 认识 "状态码" (status code) 状态码表示访问一个页面的结果 . ( 是访问成功 , 还是失败 , 还是其他的一些情况 ...). 以下为常见的状态码 . 200 OK 这 是一个最常见的状态码, 表示访问成功 . 抓包抓到的大部分结果都是 200 例如访问搜狗…

C# byte[] 如何转换成byte*

目标:将byte[]转成byte*以方便使用memcpy [DllImport("kernel32.dll", EntryPoint "RtlCopyMemory", CharSet CharSet.Ansi)] public extern static long CopyMemory(IntPtr dest, IntPtr source, int size); private void butTemp_Click(object…

C语言实现通讯录 (附完整代码)

C语言实现通讯录 🍀实现一个通讯录:🍀通讯录的功能:🍀多文件实现💮设计结构体——保存人的信息💮初始通讯录💮封装通讯录💮define宏定义修改通讯录的最大容量初始化通讯录…

Gitlab仓库部署

Gitlab仓库部署 一、Gitlab的概述1、gitlab介绍2、gitlab主要功能3、gitlab和github的区别 二、部署环境1、安装依赖环境2、安装Postfix邮箱3、Gitlab优势4、Gitlab工作流程 三、Gitlab部署过程1、Yum安装Gitlab2、配置gitlab站点URL3、启动并访问Gitlab 四、Gitlab具体操作1、…

C++中的导入include,头文件,extern,main函数入口及相关编译流程

结论: 1:#include就是复制粘贴 2:C编译的时候,在链接之前,各个文件之间实际上没有联系,只有到了链接的阶段,系统才会到各个cpp文件中去找需要的文件; 一:include的作用…

详解混合类型文件(Polyglot文件)的应用生成与检测

1. 引入 混合类型文件(Polyglot文件),是指一个文件,既可以是合法的A类型,也可以是合法的B类型。 比如参考3中的文件,是一个html文件,可以用浏览器正常打开;它也是一个一个.jar文件&…

OpenCV之怀旧色、冰冻滤镜、熔铸滤镜

怀旧色 源码&#xff1a; void huaijiu(Mat& src,Mat& dst) {for (int h 0;h < src.rows;h ){uchar *d1 src.ptr<uchar>(h);uchar *d2 dst.ptr<uchar>(h);for (int w 0;w < src.cols;w ){int w3 3*w;int r d1[w3 2];int g d1[w3 1];int …

民用大中型无人直升机系统飞行性能飞行试验要求

声明 本文是学习GB-T 42856-2023 民用大中型无人直升机系统飞行性能飞行试验要求. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了民用大中型无人直升机系统飞行性能飞行试验的内容、目的、条件、实施、数据处理和 结果评定等要…

linux相关知识以及有关指令3

在linux的世界中我们首先要有万物皆文件的概念&#xff0c;那么在系统中有那么多的文件&#xff0c;我们该怎么区分呢&#xff1f;文章目录 1. 文件分类2. 文件的权限1). 拥有者和所属组以及other2). 文件的权限3). 粘滞位4). 对于权限修改的拓展知识点a.修改权限b.修改拥有者所…

【MySQL进阶】SQL性能分析

一、SQL性能分析 1.SQL执行频率 MySQL 客户端连接成功后&#xff0c;通过 show [session|global] status 命令可以提供服务器状态信 息。通过如下指令&#xff0c;可以查看当前数据库的 INSERT 、 UPDATE 、 DELETE 、 SELECT 的访问频次&#xff1a; -- session 是查看当…

Linux学习之基础工具二

经过学习我们已经大致的学会了vim的使用&#xff0c;可以利用vim进行代码的编写了&#xff0c;在学习c语言的时候我们就知道&#xff0c;编译完成一个代码需要进行四个步骤&#xff1a; 1. 预处理&#xff08;进行宏替换) 2. 编译&#xff08;生成汇编) 3. 汇编&#xff08;生…

Java实现计算两个日期之间的工作日天数

需求&#xff1a; 需要在后端实现 计算当前日期与数据库内保存的日期数据之间相隔的工作日数目 实现 import java.time.DayOfWeek; import java.time.LocalDateTime;public class WorkdaysCalculator {public static void main(String[] args) {String givenDateTimeStr &q…

HTTPS Tomcat Servlet 博客系统 软件测试的概念 Linux

第 1 题&#xff08;多选题&#xff09; 题目名称&#xff1a; 以下关于http和https说法正确的是 题目内容&#xff1a; A .http是超文本传输协议 B .https是超文本传输安全协议 C .http是明文传输 D .https是加密传输 第 2 题&#xff08;单选题&#xff09; 题目名称…

【计算机视觉】Image Feature Extractors方法介绍合集(一)

文章目录 一、Convolution二、1x1 Convolution三、Depthwise Convolution四、Pointwise Convolution五、Depthwise Separable Convolution六、Grouped Convolution七、Dilated Convolution八、3D Convolution九、Non-Local Operation十、Deformable Convolution十一、Switchabl…

UI自动化测试神器Playwright(Java版)(保存登录cookie,解决免登录)

&#x1f3ad; Playwright在称为浏览器上下文的隔离环境中执行测试。该隔离模型提高了可重复性并防止相关联的测试脚本执行失败。测试可以加载现有的已验证状态&#xff0c;比如获取已登录的状态&#xff08;Cookie&#xff09;&#xff0c;在后续脚本中复用。这消除了在每个测…

【论文笔记】Perception, Planning, Control, and Coordination for Autonomous Vehicles

单纯作为阅读笔记&#xff0c;文章内容可能有些混乱。 文章目录 1. Introduction2. Perception3. Planning3.1. Autonomous Vehicle Planning Systems3.2. Mission Planning3.3. Behavioral Planning3.4. Motion Planning3.4.1. Combinatorial Planning3.4.2. Sampling-Based P…

web安全漏洞-SQL注入攻击实验

实验目的 学习sql显注的漏洞判断原理掌握sqlmap工具的使用分析SQL注入漏洞的成因 实验工具 sqlmap是用python写的开源的测试框架&#xff0c;支持MySQL&#xff0c;Oracle&#xff0c;PostgreSQL&#xff0c;Microsoft SQL Server&#xff0c;Microsoft Access&#xff0c;I…

解决mybatis-plus不能俩表联查分页之手动写分页

public class MyPageHelper {// 调用pageInfo插件内的方法 开启分页 需要传入一个起始页的值和每页显示的条数public static void startPage(PageRequest pageRequest) {PageHelper.startPage(pageRequest.getPageNum(),pageRequest.getPageSize());}// 封装结果集public stati…

【CMU15-445 Part-11】Join Algorithms

Part11-Join Algorithms Why Do We Need to Join? Join其实是关系数据库和范式化表时候所产生的副产物。 也就是说我们范式化表是为了减少冗余信息&#xff0c;而我们使用join就是为了去重建reconstruct 这些原本的tuple Join Algorithms 主要关注两表的inner equijoin a…