在 Mac M2 (arm64架构)上编译安装 GmSSL 工具

news2024/11/22 20:52:42

GmSSL是一个开源密码工具包,为GM/T系列标准中规定的中国国家密码算法和协议提供一级支持。作为OpenSSL项目的一个分支,GmSSL提供了与OpenSSL的API级兼容性,并维护了所有功能。现有的项目,如ApacheWeb服务器,只需稍加修改和简单的重建,就可以轻松地移植到GmSSL。自2014年底首次发布以来,GmSSL已被开源中国推荐的六个加密项目之一,并获得2015年中国Linux软件奖。


在 App Store 上安装 Xcode

此步骤略过,自行安装

下载 GmSSL 软件包或拉取该项目

项目地址:https://github.com/guanzhi/GmSSL.git
如果下载的 zip 压缩包,请自行解压

编译并安装

进入 GmSSL

cd GmSSL

文件修改

添加 arm64 编译选项

由于 Mac 下编译的 GmSSL 为 x86i386 架构,而 M1 使用了 arm64 架构,编译文件中并未提供 Mac arm64架构的编译配置,所以需要修改 Configurations/10-main.conf,在文件末尾 ); 内添加如下内容:

    "darwin64-arm64-cc" => {
        inherit_from     => [ "darwin-common", asm("aarch64_asm") ],
        cflags           => add("-arch arm64 -DL_ENDIAN -Wall -isysroot \$(CROSS_TOP)/SDKs/\$(CROSS_SDK)"),
        bn_ops           => "SIXTY_FOUR_BIT_LONG",
        perlasm_scheme   => "macosx",
        shared_ldflag    => "-arch arm64 -dynamiclib",
    },

位置参考:

修改 Configure 和 test/build.info

由于编译过程中可能会遇到 this system (darwin64-x86_64-cc) is not support 错误,这也在GmSSL项目的 issue 中所提到https://github.com/guanzhi/GmSSL/issues/811

解决方案如下:

将 Configure 文件与 test/build.info 文件中的

use if $^O ne "VMS", 'File::Glob' => qw/glob/;

修改为

use if $^O ne "VMS", 'File::Glob' => qw/:glob/;

修改 engines/afalg/e_afalg.c 文件

编译过程中还会遇到 engines/afalg/e_afalg.c:110:20: error: '__NR_eventfd' undeclared (first use in this function); did you mean 'eventfd'? 错误

解决方案:

方案一:

找到 static ossl_inline int eventfd(int n) 函数,将内容改为如下:

static ossl_inline int eventfd(int n)
{
    return syscall(__NR_eventfd2, n);
}

方案二:

# 在编译时,添加如下参数,此方案未尝试过,请自行食用
sudo ./config -DGMSSL_NO_TURBO no-afalgeng

编译配置

tips:

  1. 如果需要与 OpenSSL 共存,则需要指定 GmSSL 的安装路径
  2. 同时需要添加 no-shared 参数:只编译静态库
  1. 设置环境变量
export CC=clang
export CROSS_TOP=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer
export CROSS_SDK=MacOSX.sdk
export PATH="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:$PATH"
  1. 编译配置
# --prefix 指定 gmssl 的安装路径
# --openssldir 表示 OpenSSL 数据区域,例如openssl.cnf,证书和密钥. 如果是相对目录,它将被添加到--prefix给定的目录中。【可以不指定,默认在 --prefix 同级目录的 ssl 目录】
# no-shared 表示只编译静态库,不编译动态库

./Configure darwin64-arm64-cc --prefix="/usr/local/gmssl" no-asm no-shared -DGMSSL_NO_TURBO enable-ec_nistp_64_gcc_128

安装

# 如果需要加快编译速度,可根据实际情况使用 -j 参数指定可同时执行命令的数量,如 make -j 16 表示可同时执行 16 个命令,但受限于CPU的核心数
make

# 安装(如果有旧版本,可以使用 make uninstall 卸载,然后删除对应文件)
make install

添加环境变量

如果未指定安装目录,则不需要此步骤

# 添加环境变量
echo 'export PATH="$PATH:/usr/local/gmssl/bin"' >> ~/.bash_profile
source ~/.bash_profile

验证

$ gmssl version -a
GmSSL 2.5.4 - OpenSSL 1.1.0d  19 Jun 2019
built on: reproducible build, date unspecified
platform: darwin64-arm64-cc
compiler: cc -DDSO_DLFCN -DHAVE_DLFCN_H -DNDEBUG -DOPENSSL_THREADS -DOPENSSL_NO_DYNAMIC_ENGINE -DOPENSSL_PIC -DGMSSL_NO_TURBO -DOPENSSLDIR="\"/usr/local/gmssl/ssl\"" -DENGINESDIR="\"/usr/local/gmssl/lib/engines-1.1\""
OPENSSLDIR: "/usr/local/gmssl/ssl"
ENGINESDIR: "/usr/local/gmssl/lib/engines-1.1"

问题集锦

  1. 出现assert.h file not found 错误
crypto/aes/aes_core.c:39:10: fatal error: 'assert.h' file not found

此问题是由于 MacOSX.SDK 环境变量设置错误,或没有安装 Xcode app,如果没有安装 Xcode,则需要将编译步骤中的环境变量:

export CROSS_TOP=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer
export CROSS_SDK=MacOSX.sdk
export PATH="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:$PATH"

根据实际情况指定到正确的目录位置,如 /Library/Developer/CommandLineTools/SDKs/ 目录下(但此方法未做尝试,自行食用)


安装过程中,可能会出现其他问题,欢迎提出讨论!

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

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

相关文章

前端面试题整理3

目录 1.不使用promise怎么实现一个异步编程? 2.this的指向有哪些? 3.Ref和reactive响应式的区别? 4.首屏加载优化。如何处理? 5.axios封装? 6.css为什么使用预处理? 7.从1000-9999里面取出AAAA这种数字&#xf…

从价格战中突围,仅10个月开发出一款车,安全性能靠谱吗?

经历了2023年初的价格战,一场关于智能汽车的淘汰赛似乎正式开始了。 尽管“降价热潮”还在继续,但简单的价格竞争毕竟非长久良策。 一方面,为了维持收益,部分车企通过减配、降低服务成本,甚至将降本压力给到上游供应…

【这个命令的 7 种用法!你确定不会用?】

可以很肯定地说,find 命令是 Linux 后台开发人员必须熟知的操作之一,除非您使用的是 Windows Server。 对于技术面试,它也是一个热门话题。让我们看一道真题: 如果你的 Linux 服务器上有一个名为 logs 的目录,如何删…

Spring 事务和事务传播机制

1.什么是事务(为什么要有事务) 事务就是将一组操作封装成一个执行单元(封装到一起),要么一起成功,要么一起失败。 在打账的情景上,A向B转账200 元,A的账户-200.B的账号200&#xff…

基于直流微电网的光伏并网功率转换装置设计与运行仿真

摘要 微电网是目前国内外应用较为广泛的一种绿色可再生能源,近几年我国微电网产业的发展十分迅速。然后,越来越多的微电网系统建立并网,微电网产生的电能受外界因素影响较大,具有一定的随机性和波动性,给并网后的电力系…

SaaS 产品如何选择设计协作工具?

文章内容转载腾讯 CoDesign 随着互联网及其衍生技术的发展,企业比以往更依赖内容去吸引、去培养自己的用户,寻求转化。小鹅通就是在微信生态中帮助企业通过知识服务去实现内容分发和流量聚合,帮助企业沉淀用户,提供深度私域运营服…

回收站清空了怎么找回文件?3种办法恢复彻底删除文件!

电脑回收站大家都有一定的了解,只要在回收站的文件没有被删除的时候是可以还原的,但是回收站删除了,文件就无法直接恢复。回收站清空了怎么找回文件? 别着急,今天小编就分析几种恢复回收站删除数据的办法: 方法一&am…

(转载)从0开始学matlab(第8天)—matlab画图入门

1.基本画图方式 MATLAB 的扩展性和机制独立的画图功能是一个极其重要的功能.这个功能使数据画图变得十分简单 . 画一个数据图 , 首先要创建两个向量,由 x, y 构成 , 然后使用 plot 函数. 例如 , 假设我们要画出函数 yx -10x10 的图象 , 定义域为[ …

分享两组不同的3D VR卡片

最近某音上出现了很多VR视频,转动手机可以看到手机界面未显示出来的场景。这种事情我觉得我们也可以做到。 所以两种不同的3D VR卡片来了: 第一种是横向或上下可以拖动极大的距离。卡片上的信息会随着拖动移动,但不会显示更多的信息&#x…

二、LLC 谐振变换器

半桥 LLC 谐振变换器主电路结构 如图所示,半桥 LLC 谐振变换器主电路可以分为四个部分,即:逆变网络、谐振网络、变压器及整流滤波网络。两个 MOSFET(S1、S2)以及它们的体二极管(D1、D2)和寄生电…

svn清理以下路径失败显示乱码问题

报错: svn作为我们经常使用的版本管理服务器,在使用过程中经常需要通过clean up操作来完成本地文件与服务器文件信息及版本信息同步, 然而有时右键会在执行清理命令时提示“清理以下路径失败: xxx 文件名、目录名或卷标语法不…

DevOps 的道术法器,探寻 DevOps “立体化”实践之旅

​引言 随着业务的发展,软件发布迭代的频率越来越高,传统的瀑布型模式已经不能满足快速交付的需求,DevOps 也因此受到持续关注。越来越多的公司开始接受并尝试使用 DevOps,期望能使得软件开发中的构建、测试与发布工作变得更加快捷…

进程与线程的理解

目录 一、进程 1、进程的简介: 2、进程的组成: 3、进程的状态 4、进程控制: 5、进程的创建: 6、进程的终止 7、进程的阻塞和唤醒 8、进程上下文切换 二、线程 1、线程: 2、线程的优缺点: 三、进程与线程 比…

火山引擎 DataLeap:3 步打造“指标管理”体系,幸福里数据中心是这么做的

更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 一家企业,为什么要搭建指标体系? 一句话总结来说,全面、合理的指标体系可以帮助企业统一目标,将业务环节量化&#…

1073. 负二进制数相加(leetcode,模拟,数学分析)-------------------c++实现

1073. 负二进制数相加(leetcode,模拟,数学分析)-------------------c实现 题目表述 给出基数为 -2 的两个数 arr1 和 arr2,返回两数相加的结果。 数字以 数组形式 给出:数组由若干 0 和 1 组成,按最高有效位到最低有…

Kubernetes1.26.3 高可用集群

Kubernetes1.26.3 高可用集群 0、服务器信息 服务器为腾讯云服务器(按需计费,按流量计费,并且将IP转换为弹性IP,使用结束可关机仅收取硬盘等固定资源费用) 服务器名称IP描述组件信息Kubernetes1124.223.218.159maste…

Matlab如何调用外部函数/工具包,如何将新函数加到默认函数库中

自从开始制作、分享工具包,我被问到最多的一个问题是: “XXX工具包怎么用?” 而我给出的回答通常是: “放在你代码文件夹,当函数调用。” 什么意思呢? 方法1 比如在名为“1”的文件夹中放着我们想要运…

TreeSet源码分析

概述 TreeSet ,基于 TreeSet 的 Set 实现类。在业务中,如果我们有排重 排序的需求,一般会考虑使用 TreeSet #TreeSet的继承关系 TreeSet的内部属性 m 的 key ,存储 HashSet 的每个 key 。 map 的 value ,因为 TreeSe…

DJ5-3 多路访问链路和协议

目录 一、网络链路 二、广播信道要解决问题 三、多路访问协议 1、基本介绍 2、多路访问协议的类型(3) 四、信道划分协议 1、时分多路访问 TDMA 2、频分多路访问 FDMA 3、码分多路访问 CDMA(略) 五、随机访问协议 1、纯…

基于AD96808 FMC 模块,支持8 路14-bit、500MSPS/1GSPS/1.25GSPSADC 采集功能

板卡概述 FMC-XM148 是一款基于VITA57.4 标准的JESD204B 接口FMC 子卡模块,该模块可以实现8 路14-bit、500MSPS/1GSPS/1.25GSPSADC 采集功能。该板卡ADC 器件采用ADI 公司的AD9680 芯片,全功率-3dB 模拟输入带宽可达2GHz。该ADC 与FPGA 的主机接口通过16 通道的高速…