GmSSL2.x编译iOS静态库和Android动态库

一、GMSSL-2.5.4

国密SDK源码下载

1.1 cd到SDK源码目录

cd /Users/xxxx/Downloads/GmSSL-main

1.2 查看SDK适用环境

./config
202404181803341.png

上图中错误解决方法

使用文本编辑器打开SDK目录下Configure、test/build.info、test/run_tests.pl。
use if $^O ne "VMS", "File::Glob" => qw/glob/;
改为
use if $^O ne "VMS", "File::Glob" => qw/:glob/;

1.3 添加srp.h头文件

202405111241861.jpg

从包含srp.h头文件的GMSS工程中拷贝srp.h到GmSSL-main-->include-->openssl

1.4 安装GMSSL

有安装需求的才安装,只是编译库文件不必安装GMSSL到电脑

make
make test
sudo make install
  • 查看gmssl版本
gmssl version

1.5 卸载GMSSL

  • 查看gmssl安装路径

    which gmssl
    
202405140852504.jpg
  • 查看openssl安装路径

    which openssl
    
202405140853850.jpg
  • 删除gmssl安装文件

    rm -rf /user/local/bin/gmssl
    
  • 删除openssl安装文件

    rm -rf /user/local/bin/openssl
    
  • 删除openssl头文件

    sudo rm -rf /user/local/include/openssl
    

1.6 添加新文件参与编译步骤

添加新文件到GmSSL项目目录中,下面以GmSSL-->ssl文件为例

202405140913645.jpg
  • 新文件引入gmssl头文件格式

    引入格式 #include <openssl/xxx.h>

    如果编写的新文件需要使用到gmssl中的头文件,引入格式是#include <openssl/xxx.h>,否则编译过程中会报找不到头文件的错误。

  • 修改build.info文件

    gmssl项目的每个参与编译的文件夹下都有build.info文件,向build.info中添加需要参与编译的文件路径

    202405140922874.jpg

二、编译iOS静态库

编译环境准备:Mac电脑,Xcode。

2.1 编译armv7/armv7s架构

  • 清理编译文件
make distclean
  • 设置编译器 ,编译armv7s只需将armv7替换成armv7s即可
export CC="clang -arch armv7"
  • 设置工具链路径
export PATH="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:$PATH"
  • 设置开发环境目录
export CROSS_TOP=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer
  • 设置SDK,版本在开发环境目录下SDKs中查看
export CROSS_SDK=iPhoneOS17.2.sdk
  • 设置最小依赖版本
export IPHONEOS_DEPLOYMENT_TARGET=8.0
  • 生成makefile
./Configure ios-cross no-shared -DGMSSL_NO_TURBO
  • 构建
make

2.2 编译arm64架构

  • 清理编译文件
make distclean
  • 设置编译器
export CC="clang -arch arm64"
  • 设置工具链路径
export PATH="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:$PATH"
  • 设置开发环境目录
export CROSS_TOP=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer
  • 设置SDK,版本在开发环境目录下SDKs中查看
export CROSS_SDK=iPhoneOS17.2.sdk
  • 设置最小依赖版本
export IPHONEOS_DEPLOYMENT_TARGET=8.0
  • 生成makefile
./Configure ios64-cross no-shared -DGMSSL_NO_TURBO
  • 构建
make

2.3 编译i386和x86_64

  • 清理编译文件
make distclean
  • 设置编译器
export CC="clang -arch i386 -arch x86_64"
  • 设置工具链路径
export PATH="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:$PATH"
  • 设置开发环境目录
export CROSS_TOP=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer
  • 设置SDK,版本在开发环境目录下SDKs中查看
export CROSS_SDK=iPhoneSimulator17.2.sdk
  • 设置最小依赖版本
export IPHONEOS_DEPLOYMENT_TARGET=8.0
  • 生成makefile
./Configure iphoneos-cross no-shared -DGMSSL_NO_TURBO 
  • 构建
make

2.4 静态库合并

  • 合并命令
lipo -create 模拟器.a文件路径  真机.a文件路径 -output 合成的.a文件路径
  • 查看静态库信息
lipo -info  .a文件路径

三、编译Android动态库

编译环境:Mac电脑,NDK,Linux系统。

3.1、下载安卓NDK

下载NDK到本地,选择一个比较新的版本下载即可,我选择的是android-ndk-r17c-linux-x86_64.zip

3.2、安装Linux系统

Android动态库必须在Linux系统下编译,因此需要在Mac电脑上安装虚拟机,我选择的是ubuntu系统。

  • 安装VMware Fusion虚拟机Mac版

下载破解版VMware Fusion,然后安装软件到电脑。

  • 安装Linux系统

前往Ubuntu官网下载带有桌面GUI的Ubuntu版本。

Xnip2024-05-20_13-16-59.jpg

安装Ubuntu Desktop版本

Xnip2024-05-20_13-25-41.jpg
Xnip2024-05-20_13-30-11.jpg
  • 安装apt包管理器
sudo apt update
Xnip2024-05-20_14-36-05.jpg
  • 安装make工具
sudo apt-get install make
  • 安装gcc
sudo apt-get install gcc
  • 安装文件共享工具
sudo apt install open-vm-tools open-vm-tools-desktop

3.3、添加共享文件夹

Xnip2024-05-20_14-49-12.jpg
Xnip2024-05-20_14-51-10.jpg
  • Ubuntu使用共享文件夹

共享文件夹一般都在/mnt/hgfs/路径下。

cd /mnt/hgfs
  • 查看共享文件夹
ls /mnt/hgfs

如果查不到添加的共享文件夹可执行如下命令重新挂载。

sudo mkdir -p /mnt/hgfs
sudo mount -t fuse.vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other

3.4、编写编译脚本

脚本中的gmssl2-ubuntu为共享文件夹,添加共享文件夹的步骤请参考3.3章节,将编写好的脚本文件、NDK、GmSSL的源码放在gmssl2-ubuntu中。

#!/bin/bash

# Define paths and environment variables
# 获取脚本当前所在路径
CURRENT_PATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
# 获取GmSSL源码路径
GMSSL_DIR=$CURRENT_PATH/GmSSL2.5.4
# 取脚本执行的第一个参数
ANDROID_TARGET_ABI=$1
# 获取NDK路径
ANDROID_PATH=/mnt/hgfs/gmssl2-ubuntu/android-ndk-r17c
# 适配最低版本
PLATFORM_VERSION=21

MAKE_TOOLCHAIN=$ANDROID_PATH/build/tools/make-standalone-toolchain.sh

export TOOLCHAIN_PATH=$ANDROID_PATH/toolchains

$MAKE_TOOLCHAIN --arch=arm --platform=android-$PLATFORM_VERSION --install-dir=$TOOLCHAIN_PATH

if [ "$ANDROID_TARGET_ABI" == "armeabi-v7a" ]
then
    #armv7:armv7a(32位)
    export MACHINE=armv7
    #armv7:android
    export SYSTEM=android
    #armv7:arm
    export ARCH=arm
    # ("armeabi" "armeabi-v7a" "arm64-v8a" "x86" "x86_64" )
    outdir=armeabi-v7a
    # ("android" "android-armeabi" "android64-aarch64" "android-x86" "android64")
    architecture=android-armeabi
    
    export TOOL_BASENAME=$TOOLCHAIN_PATH/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi
    export CROSS_SYSROOT="$ANDROID_PATH/platforms/android-$PLATFORM_VERSION/arch-arm -isystem $ANDROID_PATH/sysroot/usr/include -isystem $ANDROID_PATH/sysroot/usr/include/arm-linux-androideabi"
    
elif [ "$ANDROID_TARGET_ABI" == "arm64-v8a" ]
then
    #armv8:arm64(64位)
    export MACHINE=armv8
    #armv8:android-v8
    export SYSTEM=android-v8
    #armv8:aarch64
    export ARCH=aarch64
    # ("armeabi" "armeabi-v7a" "arm64-v8a" "x86" "x86_64" )
    outdir=arm64-v8a
    # ("android" "android-armeabi" "android64-aarch64" "android-x86" "android64")
    architecture=android64-aarch64
    
    export TOOL_BASENAME=$TOOLCHAIN_PATH/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android
    export CROSS_SYSROOT="$ANDROID_PATH/platforms/android-$PLATFORM_VERSION/arch-arm64 -isystem $ANDROID_PATH/sysroot/usr/include -isystem $ANDROID_PATH/sysroot/usr/include/aarch64-linux-android"
    
elif [ "$ANDROID_TARGET_ABI" == "x86" ]
then
    # ("armeabi" "armeabi-v7a" "arm64-v8a" "x86" "x86_64" )
    outdir=x86
    # ("android" "android-armeabi" "android64-aarch64" "android-x86" "android64")
    architecture=android-x86
    
    export TOOL_BASENAME=$TOOLCHAIN_PATH/x86-4.9/prebuilt/linux-x86_64/bin/i686-linux-android
    export CROSS_SYSROOT="$ANDROID_PATH/platforms/android-$PLATFORM_VERSION/arch-x86 -isystem $ANDROID_PATH/sysroot/usr/include -isystem $ANDROID_PATH/sysroot/usr/include/i686-linux-android"
    
elif [ "$ANDROID_TARGET_ABI" == "x86_64" ]
then
    # ("armeabi" "armeabi-v7a" "arm64-v8a" "x86" "x86_64" )
    outdir=x86_64
    # ("android" "android-armeabi" "android64-aarch64" "android-x86" "android64")
    architecture=android64
    
    export TOOL_BASENAME=$TOOLCHAIN_PATH/x86_64-4.9/prebuilt/linux-x86_64/bin/x86_64-linux-android
    export CROSS_SYSROOT="$ANDROID_PATH/platforms/android-$PLATFORM_VERSION/arch-x86_64 -isystem $ANDROID_PATH/sysroot/usr/include -isystem $ANDROID_PATH/sysroot/usr/include/arch-x86_64"
    
else
    echo "Unsupported target ABI: $ANDROID_TARGET_ABI"
    exit 1
fi

export CC=$TOOL_BASENAME-gcc
export CXX=$TOOL_BASENAME-g++
export LD=$TOOL_BASENAME-ld
export LINK=$CXX
export AR=$TOOL_BASENAME-ar
export RANLIB=$TOOL_BASENAME-ranlib
export STRIP=$TOOL_BASENAME-strip

# Navigate to OpenSSL directory
cd ${GMSSL_DIR}

# Configure with sysroot and prefix
./Configure ${architecture} -D__ANDROID_API__=$PLATFORM_VERSION no-asm no-unit-test no-serpent

# Build OpenSSL
make

# Copy the outputs
OUTPUT_INCLUDE=$CURRENT_PATH/output/include
OUTPUT_LIB=$CURRENT_PATH/output/lib/${outdir}
mkdir -p $OUTPUT_INCLUDE
mkdir -p $OUTPUT_LIB
cp -RL include/openssl $OUTPUT_INCLUDE
cp libcrypto.so $OUTPUT_LIB
cp libcrypto.a $OUTPUT_LIB
cp libssl.so $OUTPUT_LIB
cp libssl.a $OUTPUT_LIB

我将编写好的脚本文件命名为and.sh。gmssl2-ubuntu中的文件结构如下:

Xnip2024-05-20_15-07-26.jpg

3.5、执行编译脚本

以下所有的编译指令都在Linux系统中执行。编译失败或重新编译架构之前在GmSSL源码的根目录下执行:make distclean

  • cd到gmssl2-ubuntu目录
cd /mnt/hgfs/gmssl2-ubuntu
  • 添加脚本文件权限
chmod a+x and.sh
  • 编译arm64-v8a
./and.sh arm64-v8a
Xnip2024-05-21_16-02-12.jpg
  • 编译armeabi-v7a
./and.sh armeabi-v7a
  • 编译x86
./and.sh x86
  • 编译x86_64
./and.sh x86_64

编译出来的动态库

Xnip2024-05-20_16-21-18.jpg
  • 查看动态库架构
cd /Users/xxxx/Desktop/gmssl2-ubuntu/out/output/lib/armeabi
file libcrypto.so
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容