交叉编译openssl

需要交叉编译aarch64/arm32版本的openssl,需要在第一个参数位置指定目标架构,–cross-compile-prefix指定了命令前缀,当然这些命令的路径需要在PATH中设置。

 ./Configure linux-aarch64 --cross-compile-prefix=aarch64-himix100-linux- --prefix=/data/work/openssl_instasll && make && make install
 ./Configure linux-armv4 --cross-compile-prefix=arm-himix200-linux- --prefix=/data/work/openssl_instasll && make && make install

下面是对openssl 一些文件的翻译,方便理解编译规则

NOTES.UNIX

OpenSSL 使用编译器去链接程序和动态库。

OpenSSL产生的Makefil 使用c 编译器命令行命令去链接程序、动态库。由于这个原因,任何传入configuration 脚本的链接器选项都必须满足链接器需要的格式。

动态库和安装目录在非默认位置

每个unix系统都有自身的动态库按照位置,像/lib,/usr/lib 或者 /usr/local/lib。 如果动态库被安装在非默认位置,动态链接的二进制程序将无法找到它们,因此运行失败,除非指定了运行时库搜索路径。

对OpenSSL 应用,我们的配置脚本不会设置运行时库搜索路径。因此,建议大家在配置时,显式的设置它,除非库被安装到你知道的路径下。

运行时动态库搜索路径可以有不同的方式来指定,依据它所运行的系统和版本。

设置运行时动态库搜索路径的可能选项为:

 -Wl,-rpath,/whatever/path  # linux,*BSD-R /whatever/path # Solaris-Wl,-R,/whatever/path #AIX-Wl,+b,/whatever/path  # HP-UX-rpath /whatever/path  #Tru64,IRIX

OpenSSL的配置脚本会识别所有的选项,把它们传入到Makefile中。(事实上,以-Wl 开头的所有参数都会被识别为连接器选项)。

请注意,在给出运行时动态库搜索路径时,不要一字不差的使用路径名称。一些OpenSSL 配置会对安装目录添加一个额外的目录。为了方便使用,生成的Makefile中的LIBRPATH变量会包含这些路径,该变量被用于提供运行时动态库路径,用法像下个例子中所示:

./config --prefix=/usr/loca/ssl --openssldir=/usr/local/ssl '-Wl,-rpath,$(LIBRPATH)'

在基于现代ELF格式的系统中,有2种运行时动态库搜索路径标志:DT_RPATH和 DT_RUNPATH.动态搜索库的查找顺序:
1. 使用DT_RPATH指定的目录,除非 DT_RUNPATH也被设置。
2. 使用环境变量 LD_LIBRARY_PATH 指定的目录
3. 使用 DT_RUNPATH 指定的目录
4. 使用系统共享对象缓存和默认目录。
这意味着,如果库在DT_RPATH(DT_RUNPATH没有被设置)指定的路径中被找到,则LD_LIBRARY_PATH指定的路径将不会起作用。

DT_RPATH和DT_RUNPATH中到底哪一个被默认设置,是依赖于系统的。例如,根据文档,在Solaris中,DT_RPATH 被废弃,所以更倾向于使用DT_RUNPATH。在Debian GNU/LINUX中,两者都可以被设置,DT_RPATH是被默认设置的那个。

怎样去选择 运行时搜索库标志依赖于系统,请查阅ld 手册去确定。作为一个例子,在Debian GNU/linux 系统中,确保DT_RUNPATH被设置(而不是DT_RPATH)的一个方法是:告诉链接器设置新的标志:

./config --prefix=/usr/local/ssl --openssldir=/usr/local/ssl '-Wl,--enable-new-dtags,-rpath,$(LIBRPATH)'

链接你的应用

动态链接OpenSSL 动态库的第三方应用会面对非默认安装位置的问题。

上面提到的 OpenSSL 配置选项可能会也可能不会影响到目标应用的链接。可能会是指: 在一些环境下,会自然的链接到OpenSSL动态库,例如,-L/whatever/path -lssl -lcrpto. 但是也有一些环境,你不得不自己显式的指定运行时动态库搜索路径。

编译动态库时也会安装静态库。链接静态库时,需要多加注意,因为链接器经常会首先查找动态库,对静态库视而不见。这种情况需要查看系统文档。

安装

惯例

命令

以$ 开头

$ command

选择

  • 在 {}中,用 | 分割,表示 强制选项。

    $ echo { WORD1 | WORD2 | WORD3 }
    

    表示一下三个命令之一

    $ echo WORD1
    - or -
    $ echo WORD2
    - or -
    $ echo WORD3
    
  • 在[ ]中,用| 分割,表示可选选项。
$ echo [ WORD1 | WORD2 | WORD3 ]

表示以下4个命令之一

$ echo WORD1
- or -
$ echo WORD2
- or -
$ echo WORD3
- or -
$ echo

参数

  • 强制参数在 {{ }}中
  • 可选参数在 [[ ]] 中

配置选项

在运行./config(或./Configure) 时,有一些选项,允许客户定制化编译。

API Level

--api=x.y[.z]

编译指定版本的api,如果 no-deprecated被设置,将不会编译已经标记为 废弃的API。

--api=1.1.0 no-deprecated

将在OpenSSL 1.1.0版本中删除所有被标记为废弃的API接口。如果你想在当前最新版本中,删除所有被标记为废弃的API,只需指定 no-deprecated。如果--api 没有给定,默认使用当前的OpenSSL版本

Cross Compile Prefix

--crose-compile-prefix=PREFIX

PREFIX 是你的编译命令之前的所有部分。

一般来说,它以 -结束,例如,a-b-c- 将调用GNU编译器 为a-b-c-gcc.你可以需要设置很多flags 或者环境变量去让编译正常进行。android和ios对应的情况在Confiureation/15-*.conf文件中有讨论。
--openssldir 指的是目标文件系统,而不是你编译所在的文件系统。

Build Type

``shell
–debug

编译为debugging模式,-O0优化```shell
--release

编译release版本,这是默认行为。

Directories

libdir

``shell
–libdir=DIR

在安装目录(--prefix指定)下顶层目录名,库会安装在这里。默认是`lib`。
#### openssldir
```shell
--openssldir=DIR

该目录存储:OpenSSL 配置文件,默认的证书和key。默认是

Unix:           /usr/local/ssl
Windows:        C:\Program Files\Common Files\SSL
OpenVMS:        SYS$COMMON:[OPENSSL-COMMON]

prefix

--prefix=DIR

顶层安装目录。默认:

Unix:           /usr/local
Windows:        C:\Program Files\OpenSSL
OpenVMS:        SYS$COMMON:[OPENSSL-'version']

Compiler Warnings

--strict-warnings

这是一个开发者标志,用于切换多种编译选项。只在使用gcc 或 clang时才工作。

ZLib Flags

with-zlib-include

--with-zlib-include=DIR

用于定位zlib 头文件目录。该选项只有在enable-zlib后,并且头文件不在系统头文件路径下才有用。

with-zlib-lib

--with-zlib-lib=LIB

在Unix系统下:该目录包含有zlib库,如果没有提供,将会使用系统路径

Seeding the Random Generator

--with-rand-seed=seed1[,seed2,...]

逗号分割的生成seed的方法,该方法将被OpenSSL使用去获取随机输入,作为加密安全随机数字生成器的输入。当前的seed方法是:
- os
- …

Enable and Disable Features

特性选项总是成对出现,一个是使能,一个是禁止:

[ enable-xxxx | no-xxxx ]

一个特性是否enable/disable,依赖于该特性。在接下来的列表中,没有默认值的feature会在文档中提及。如果默认是disable,那么enable会在文档中提及。反之亦然。

no-afalgeng

enable-ktls

使用 Kernel TLS 支持特性。
该选项使能对Kernel TLS 数据的使用,能提高性能,允许在TLS socket时,使用sendfile和splice系统调用。如果在系统可行,kernel会使用TLS 加速器。该选项在不支持Kernel TLS的系统上是强制关闭的。

enable-asan

开启Address sanitiser(用于memory overflow的检测)。
只是一个开发者选项。

no-asm

不使用汇编代码。
在debugging模式下更容易看到该选项,release版本很少使用。

no-async

不支持异步操作

no-autoalginit

不要自动加载所有支持的加密和摘要算法。

典型的,OpenSSL 将会使它所支持的加密和摘要算法都可用。对于静态链接应用时,如果可执行文件的尺寸是要求尽可能小,这个可能会有问题。该选项只会影响libcrpyto, 如果该选项被设置,那么加密和摘要算法不得不通过EVP_add_cipher()和EVP_add_digest() 来加载。对于静态库的编译,将会强制使用该选项。

no-autoerrinit

不要自动加载所有libcrypto/libssl 错误字符串。
典型的,OpenSSL将自动加载人类可读的错误字符串。对于静态链接应用时,如果可执行文件的尺寸是要求尽可能小,这个可能会有问题。

no-autoload-config

不要自动加载默认的openssl.cnf 文件
典型的,OpenSSL会自动加载系统配置文件,这些文件会配置默认的SSL选项。

enable-buildtest-c++

当测试时,产生C++ buildtest文件,这些文件会简单的检查 OpenSSL 头文件是否单独给C++使用。

enable该选项需要额外的小心。对于任何通过configuration option直接传入的标志,你都必须确保能被c/c++编译器接受。如果不是,c++ build test 将会退出。但是你有另一个选择,你可以使用CFLAGS 和 CXXFLAGS来指定选项。

no-capieng

不编译CAPI引擎。

no-cmp

不支持Certificate Management Protocol(CMP)协议。

no-comp

不支持Cryptographic Message Syntax(CMS).

no-comp

不支持 SSL/TLS 压缩
如果该选项使能(默认),只有zlib或zlib动态库选项被选择时,压缩功能才能工作。

enable-crpyto-mdebug

只对failed-malloc 特性有用。

no-deprecated

看–api

zlib

支持zlib 压缩/解压

zlib-dynamic

OpenSSL在需要时才动态加载

编译器指定选项

-Dxxx, -Ixxx, -Wp, -lxxx, -Lxxx, -Wl, -rpath, -R, -framework, -static

环境变量

VAR=value
AR              The static library archiver.
ARFLAGS         Flags for the static library archiver.
AS              The assembler compiler.
ASFLAGS         Flags for the assembler compiler.
CC              The C compiler.
CFLAGS          Flags for the C compiler.
CXX             The C++ compiler.
CXXFLAGS        Flags for the C++ compiler.
CPP             The C/C++ preprocessor.
CPPFLAGS        Flags for the C/C++ preprocessor.
CPPDEFINES      List of CPP macro definitions, separatedby a platform specific character (':' orspace for Unix, ';' for Windows, ',' forVMS).  This can be used instead of using-D (or what corresponds to that on yourcompiler) in CPPFLAGS.
CPPINCLUDES     List of CPP inclusion directories, separatedthe same way as for CPPDEFINES.  This canbe used instead of -I (or what correspondsto that on your compiler) in CPPFLAGS.
HASHBANGPERL    Perl invocation to be inserted after '#!'in public perl scripts (only relevant onUnix).
LD              The program linker (not used on Unix, $(CC)is used there).
LDFLAGS         Flags for the shared library, DSO andprogram linker.
LDLIBS          Extra libraries to use when linking.Takes the form of a space separated listof library specifications on Unix andWindows, and as a comma separated list oflibraries on VMS.
RANLIB          The library archive indexer.
RC              The Windows resource compiler.
RCFLAGS         Flags for the Windows resource compiler.
RM              The command to remove files and directories.

不能在命令行中混合使用编译/链接 标志。换言之,以下的命令是不允许的:

./config -DFOO CPPFLAGS=-DBAR -DCOOKIE

显示配置数据

./configdata.pm --help


还有比较多选项没有介绍,需要的时候直接查看openssl源码下的install.md文档

openssl 交叉编译相关推荐

  1. linux fips 模式,linux – FIPS Capable OpenSSL交叉编译:内容指纹问题

    我在尝试使用在MIPS设备上编译为FIPS的OpenSSL共享库(libcrypto)时遇到问题. 我以下面的方式交叉编译FIPS对象模块,然后是OpenSSL库(总结): export FIPS_S ...

  2. openssl 交叉编译 armv7内核

    1.openssl源码包下载 http:// http://ftp.openssl.org/source/http:// http://ftp.openssl.org/source/ 在官网上下载最新 ...

  3. linux交叉编译openssl,交叉编译openssl for linux arm-v5te-linux-gnueabi工具链

    我遇到了同样的问题并写了一本关于如何交叉编译openssl for arm的手册 . 我希望本手册能给你一些想法: 这个过程非常简单 . 在本手册中,我们将给出一个在Ubuntu Linux系统中交叉 ...

  4. openssl 交叉编译 arm

    ARM平台的交叉编译安装: 编译:openssl ./config no-asm -shared --prefix=/arm/openssl os/compiler:arm-linux-gcc 修改: ...

  5. openssl交叉编译arm

    1.交叉编译arm环境的openssl 修改config文件: 因为芯片架构为armv7,所以添加" GUESSOS="armv7-generic-linux2" &qu ...

  6. openssl交叉编译流程

    针对交叉编译工具链的使用情况有所不同,介绍两种不同的交叉编译流程. 一.工具链提供脚本配置环境变量 使用如下命令先设置交叉编译环境 source /opt/phytec-yogurt/BSP-Yoct ...

  7. 【Android 安全】DEX 加密 ( 代理 Application 开发 | 交叉编译 OpenSSL 开源库 )

    文章目录 一.OpenSSL 开源库简介 二.OpenSSL 源码及环境变量脚本下载 三.修改环境变量脚本 四.OpenSSL 交叉编译 五.OpenSSL 交叉编译相关资源下载 参考博客 : [An ...

  8. opensll zbar交叉编译(君正平台)

    一.OpenSSL 交叉编译: 执行 ./config --prefix=$(pwd)/output no-asm shared 修改Makefile 1.PLATFORM=linux-x86_64 ...

  9. linux im6q交叉编译paho.mqtt.c

    工具链问题 本来编译一下paho应该是没大问题的,反倒是cortexa9hf-vfp-neon-poky-linux-gnueabi这个工具链使用上出问题了 从开发板开发那边拿到的或者直接从nxp社区 ...

最新文章

  1. python列表中互换位置_如何在Python列表中切换两个项目的位置?
  2. 现代浏览器博物馆_云旅游!Tableau 为你揭秘纽约现代艺术博物馆的珍贵馆藏
  3. Linux Bash 笔记
  4. 尝试用单元测试做spring注入调用service
  5. 太阳能正在崛起 光伏养老蔚然成风
  6. WPF,Silverlight与XAML读书笔记第八 - WPF新概念之三路由事件
  7. iOS系统库头文件中NS_AVAILABLE相关
  8. github上面如何编辑README
  9. 小甲鱼 OllyDbg 教程系列 (十三) : 把代码和变量注入程序 以及 硬件断点
  10. 24.8. UNION
  11. Linux——安全权限(禁止添加新用户+umask值+修改默认密码最长有效期)
  12. 编程实现 有符号乘法溢出判断
  13. Hadoop常见命令总结
  14. 倍福PLC TwinCAT 3 基础——编程基础
  15. 蚁群算法原理c语言,蚁群算法原理及其应用--详细介绍
  16. e当前登录环境异常。为了你的帐号安全,暂时不能登录web微信。你可以通过Windows
  17. 假币问题python
  18. 三亚游—温暖的寒冬、蔚蓝的海和安九拉
  19. 使用Android 原生 API获取经纬度并且根据经纬度解析出当前具体位置信息
  20. Unity-黑暗之魂复刻-动画控制器

热门文章

  1. 罗德里格旋转和李群、李代数的指数映射的关系
  2. 自然语言处理实战:机器学习常见工具与技术
  3. js身份证号码带*号处理
  4. 计算机联锁系统可靠性,计算机联锁系统的可靠性和安全性比较
  5. 夜光 :AGV 导航策略总体方案设计
  6. 微信小程序的脚本就是c语言,新手尝试编写微信小程序(2)——我的第一个微信小程序...
  7. 处理打拼音时触发input事件bug
  8. 是的你没看错,js生成word文档
  9. esp8266灯上电闪一下_如何在ESP8266上实现变色呼吸灯效果?
  10. 怎么改图片大小kb像素不变?一键快速修改jpg图片大小?