需要交叉编译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 一些文件的翻译,方便理解编译规则
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=x.y[.z]
编译指定版本的api,如果 no-deprecated
被设置,将不会编译已经标记为 废弃的API。
--api=1.1.0 no-deprecated
将在OpenSSL 1.1.0版本中删除所有被标记为废弃的API接口。如果你想在当前最新版本中,删除所有被标记为废弃的API,只需指定 no-deprecated
。如果--api
没有给定,默认使用当前的OpenSSL版本
--crose-compile-prefix=PREFIX
PREFIX 是你的编译命令之前的所有部分。
一般来说,它以 -
结束,例如,a-b-c- 将调用GNU编译器 为a-b-c-gcc.你可以需要设置很多flags 或者环境变量去让编译正常进行。android和ios对应的情况在Confiureation/15-*.conf
文件中有讨论。
--openssldir
指的是目标文件系统,而不是你编译所在的文件系统。
``shell
–debug
编译为debugging模式,-O0优化
```shell
--release
编译release版本,这是默认行为。
``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=DIR
顶层安装目录。默认:
Unix: /usr/local
Windows: C:\Program Files\OpenSSL
OpenVMS: SYS$COMMON:[OPENSSL-'version']
--strict-warnings
这是一个开发者标志,用于切换多种编译选项。只在使用gcc 或 clang时才工作。
--with-zlib-include=DIR
用于定位zlib 头文件目录。该选项只有在enable-zlib
后,并且头文件不在系统头文件路径下才有用。
--with-zlib-lib=LIB
在Unix系统下:该目录包含有zlib库,如果没有提供,将会使用系统路径
--with-rand-seed=seed1[,seed2,...]
逗号分割的生成seed的方法,该方法将被OpenSSL使用去获取随机输入,作为加密安全随机数字生成器的输入。当前的seed方法是:
- os
- …
特性选项总是成对出现,一个是使能,一个是禁止:
[ enable-xxxx | no-xxxx ]
一个特性是否enable/disable,依赖于该特性。在接下来的列表中,没有默认值的feature会在文档中提及。如果默认是disable,那么enable会在文档中提及。反之亦然。
使用 Kernel TLS 支持特性。
该选项使能对Kernel TLS 数据的使用,能提高性能,允许在TLS socket时,使用sendfile和splice系统调用。如果在系统可行,kernel会使用TLS 加速器。该选项在不支持Kernel TLS的系统上是强制关闭的。
开启Address sanitiser(用于memory overflow的检测)。
只是一个开发者选项。
不使用汇编代码。
在debugging模式下更容易看到该选项,release版本很少使用。
不支持异步操作
不要自动加载所有支持的加密和摘要算法。
典型的,OpenSSL 将会使它所支持的加密和摘要算法都可用。对于静态链接应用时,如果可执行文件的尺寸是要求尽可能小,这个可能会有问题。该选项只会影响libcrpyto, 如果该选项被设置,那么加密和摘要算法不得不通过EVP_add_cipher()和EVP_add_digest() 来加载。对于静态库的编译,将会强制使用该选项。
不要自动加载所有libcrypto/libssl 错误字符串。
典型的,OpenSSL将自动加载人类可读的错误字符串。对于静态链接应用时,如果可执行文件的尺寸是要求尽可能小,这个可能会有问题。
不要自动加载默认的openssl.cnf 文件
典型的,OpenSSL会自动加载系统配置文件,这些文件会配置默认的SSL选项。
当测试时,产生C++ buildtest文件,这些文件会简单的检查 OpenSSL 头文件是否单独给C++使用。
enable该选项需要额外的小心。对于任何通过configuration option直接传入的标志,你都必须确保能被c/c++编译器接受。如果不是,c++ build test 将会退出。但是你有另一个选择,你可以使用CFLAGS 和 CXXFLAGS来指定选项。
不编译CAPI引擎。
不支持Certificate Management Protocol(CMP)协议。
不支持Cryptographic Message Syntax(CMS).
不支持 SSL/TLS 压缩
如果该选项使能(默认),只有zlib或zlib动态库选项被选择时,压缩功能才能工作。
只对failed-malloc 特性有用。
看–api
支持zlib 压缩/解压
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, separated
by a platform specific character (':' or
space for Unix, ';' for Windows, ',' for
VMS). This can be used instead of using
-D (or what corresponds to that on your
compiler) in CPPFLAGS.
CPPINCLUDES List of CPP inclusion directories, separated
the same way as for CPPDEFINES. This can
be used instead of -I (or what corresponds
to that on your compiler) in CPPFLAGS.
HASHBANGPERL Perl invocation to be inserted after '#!'
in public perl scripts (only relevant on
Unix).
LD The program linker (not used on Unix, $(CC)
is used there).
LDFLAGS Flags for the shared library, DSO and
program linker.
LDLIBS Extra libraries to use when linking.
Takes the form of a space separated list
of library specifications on Unix and
Windows, and as a comma separated list of
libraries 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文档