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.rhkb.cn/news/134187.html

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

相关文章

Linux下安装和使用MySQL的详细教程

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

js中如何获取当前页面的URL参数值?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 获取当前页面的URL参数值⭐ 解析查询字符串⭐ 使用正则表达式解析参数值⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&am…

LC142. 环形链表 II

题目大意 给你一个链表,要求判断是否有环,若有环,找出环的入口结点。 142. 环形链表 II 判断是否有环 判环比较简单,用一个一次走一个结点的快指针,和一个一次走一个结点的慢指针同时遍历链表,若两指针相…

第一颗国产 单/双端口 MIPI CSI/DSI 至 HDMI 1.4 发射器 芯片LT9611

1. 描述 LT9611 MIPI DSI/CSI 至 HDMI1.4 桥接器具有双端口 MIPI D-PHY 接收器前端配置,每个端口有 4 个数据通道,每个数据通道以 2Gbps 的速度工作,最大输入带宽为 16Gbps。 该桥接器提供一个 HDMI 数据输出,具有可选的 …

8位和32位单片机如何选择适合,以及主要区别!

单片机直接影响到项目的成功和性能,我们将分享如何选择适合您的应用的8位或32位单片机。 8位单片机 vs. 32位单片机: 一、性能和处理能力: 8位单片机: 8位单片机通常适用于相对简单的应用,如传感器控制、LED显示、小…

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

单纯作为阅读笔记,文章内容可能有些混乱。 文章目录 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…

JavaWeb基础学习(5)

JavaWeb基础学习 一、Filter1.1 Filter介绍1.2 Filter快速入门1.3、Filter执行流程1.4、Filter使用细节1.5、Filter-案例-登陆验证 二、Listener2.1 Listener介绍2.2、ServletContextListener使用 三、AJAX3.1 AJAX介绍与概念3.2 AJAX快速入门3.3 Axios异步架构3.4 JSON-概述和…

[管理与领导-96]:IT基层管理者 - 扩展技能 - 5 - 职场丛林法则 -10- 七分做,三分讲,完整汇报工作的艺术

目录 前言: 一、汇报工作的重要性 1.1 汇报的重要性:汇报工作是工作重要的一环 1.2 向上司汇报工作状态具有重要的意义 1.2 汇报工作存在一些误解 1.3 汇报工作中的下错误做法 1.4 汇报工作与做实际工作的关系 二、工作汇报的内容与艺术 2.1 工…

Hugging Face使用Stable diffusion Diffusers Transformers Accelerate Pipelines

Diffusers A library that offers an implementation of various diffusion models, including text-to-image models. 提供不同扩散模型的实现的库,代码上最简洁,国内的问题是 huggingface 需要翻墙。 Transformers A Hugging Face library that pr…

Ubuntu安装深度学习环境相关(yolov8-python部署)

Ubuntu安装深度学习环境相关(yolov8-python部署) 本文将从如下几个方面总结相关的工作过程: Ubuntu系统安装(联想小新pro16) 2.显卡驱动安装3.测试深度学习模型 1. Ubunut 系统安装 之前在台式机上安装过Ubuntu,以为再在笔记本上安装会是小菜一碟&…

C: . 与 -> 的区别

相同点&#xff1a; 功能相同&#xff1a;访问结构体或者类的成员。优先级相同。 不同点&#xff1a; 结构体变量用 . 来访问成员&#xff1b;结构体指针用 ->来访问成员&#xff1b; #include <stdio.h> #include<string.h> //首先定义结构体类型student&a…

查询IP地址可得到哪些信息

通过IP地址定位&#xff0c;可以获取一些基本的信息&#xff0c;包括以下内容&#xff1a; 1. 地理位置&#xff1a;你可以确定IP地址所在的地理位置&#xff0c;包括国家、州或省、城市和地理坐标。这通常是通过将IP地址与地理位置数据库进行匹配来实现的。 2. ISP&#xff…

MFC中的类继承图的基本框架

一、类继承关系 从图中可知&#xff0c;在MFC中大多数的类都派生于CObject类&#xff0c;它的主要作用是为子类提供一些基本的功能&#xff0c;这些派生类构成了MFC应用程序的基本框架&#xff0c;它们各自的功能描述如表1所示。 派生类 功能描述 CCmdTarget 用于处理用户请…

解决:Loading class `com.mysql.jdbc.Driver‘. This is deprecated.

1.在连接MySQL数据库时候会出现这个报错 Loading class com.mysql.jdbc.Driver. This is deprecated. The new driver class is com.mysql.cj.jdbc.Driver. The driver is automatically registered via the SPI and manual loading of the driver class is generally unneces…

基于频谱信息的图像去噪与恢复——使用约束最小二乘方滤波法

大家好&#xff0c;我是带我去滑雪&#xff01; 随着科学技术的不断发展&#xff0c;信息的交流和获取已不再受到时空的限制&#xff0c;已经成为人们日常生活中不可或缺的一部分。图像作为人类信息交流中的重要载体&#xff0c;起着不可替代的作用。频谱图像去噪复原方法是一种…

四:内核空间内存分配

目录 内核空间内存分配 伙伴系统 slab分配器 slab分配内存 主要结构体 vmalloc 内核空间内存分配 首先从内核空间开始&#xff0c;讲解内存管理模式。 主要分为三种方式&#xff1a; 伙伴系统 解决了外部碎片问题&#xff0c;针对大块内存分配设计 Linux中的内存管理…

水一下文章

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…

selenium元素定位---ElementClickInterceptedException(元素点击交互异常)解决方法

1、异常原因 在编写ui自动化时&#xff0c;执行报错元素无法点击&#xff1a;ElementClickInterceptedException 具体报错&#xff1a;selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted: Element <span class"el-c…

Linux系统:OpenSSH7.4p升级到9.0p(服务器漏洞)

清华大学开源软件镜像站下载地址&#xff1a; https://mirrors.tuna.tsinghua.edu.cn/pub/OpenBSD/OpenSSH/portable/openssh-9.0p1.tar.gz 一、升级 0、安装Telnet &#xff08;1&#xff09;为防止安装失败&#xff0c;无法用ssh做远程连接&#xff0c;因此先安装telnet yum…

#循循渐进学51单片机#定时器与数码管#not.4

1、熟练掌握单片机定时器的原理和应用方法。 1&#xff09;时钟周期&#xff1a;单片机时序中的最小单位&#xff0c;具体计算的方法就是时钟源分之一。 2&#xff09;机器周期&#xff1a;我们的单片机完成一个操作的最短时间。 3)定时器&#xff1a;打开定时器“储存寄存器…