赞
踩
说明:
本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。
QQ 群 号:513683159 【相互学习】
openssl官网
wiki—openssl编译构建
方式一:git下载
执行命令:git clone https://github.com/openssl/openssl.git
方式二:官网下载
openssl官网下载地址
1.make工具
2.perl及其相关模组
3.ANSI C编译器
4.C的开发环境
5.支持的操作系统
Linux:
$ ./Configure
$ make
$ make test
建议:
1.出于安全考虑:默认安装地址为/usr/local
下,该位置默认不可写,故需切换为权限用户
2.若某些平台自带openssl,建议不要覆盖,因为其他应用可能依赖。
(故安装在不同位置,非系统库的全局搜索路径)
Linux:(需加sudo
)
make install
1.安装到不同位置:
1️⃣--prefix=<PREFIX>
:OpenSSL安装的顶部目录
Makefile中INSTALLTOP
的值,默认为:/usr/local
,
若不配置该选项,安装后可执行文件默认放在/usr /local/bin
,库文件默认放在/usr/local/lib
,配置文件默认放在/usr/local/etc
,其它的资源文件放在/usr /local/share
,比较凌乱
2️⃣--openssldir=<PREFIX>
:OpenSSL配置文件的目录,以及默认的证书和密钥存储库。
若为相对目录,将被添加到带有prefix
的目录上,默认为:/usr/local/ssl
如:./Configure --prefix=/opt/openssl --openssldir=/usr/local/ssl
2.指定不同版本API:
1️⃣--api=x.y[.z]
指定版本
2️⃣no-deprecated
:删除当前版本的所有已弃用的api
如:--api=1.1.0 no-deprecated
:将删除对所有在OpenSSL 1.1.0或更低版本中已弃用的api的支持。
3.指定交叉工具链:
--cross-compile-prefix=<PREFIX>
:添加指定的前缀到binutils组件。
如:--cross-compile-prefix=x86_64-w64-mingw32-
在Linux上构建mingw64目标,指定交叉工具:mingw32.(需要安装好工具链及配置相关环境)
4.构建带调试符的Openssl
--debug
:适用调试符号和零优化级别构建openssl
5.构建不带调试符的Openssl
--release
:默认选项
6.指定安装库的目录名:
--libdir=DIR
:默认为lib。
7.切换OpenSSL开发中推荐的各种编译器选项(只在gcc或clang编译器时使用)
--strict-warnings
:若正在开发OpenSSL的补丁,建议适用该选项。
8.添加给定的配置文件:
–config
:该文件将被读取在与此脚本相同目录下的任何“Configurations*”文件之后
9.显示Configure警告后不要等待
-w
:显示Configure警告后不要等待
10.不使用汇编程序
no-asm
:不使用汇编程序
11.选择要不要zlib压缩
[no-]zlib
:[don’t]编译支持zlib压缩。
12关于-match
的说明
(*)尽管在llvm 3.6中实现了对AVX512的支持,但在7.0版本之前,显然需要显式的-march标志来编译汇编模块。对于大于7.0的版本,可以通过强制构建过程使用以下脚本来解决这个问题:
#!/bin/sh
exec clang -no-integrated-as "$@"
而不是真正的clang。在这种情况下,使用什么clang版本并不重要,因为要检查的是GNU汇编程序的版本。
更多请查看INSTALL.md
文档。
与普通环境变量赋值相同,但在所有平台都支持,并仅限配置脚本。
若有相同环境变量,则会覆盖掉,选项有:
环境变量 | 说明 |
---|---|
AR | 静态库归档程序 |
ARFLAGS | 静态库存档器的标志。 |
AS | 汇编编译器 |
ASFLAGS | 汇编编译器的标志 |
CC | C编译器 |
CFLAGS | C编译器的标志 |
CXX | c++编译器 |
CXXFLAGS | c++编译器的标志 |
CPP | C/ C++预处理器 |
CPPFLAGS | C/ C++预处理器的标志 |
CPPDEFINES | CPP宏定义列表,Unix使用:空格或:分格。 |
CPPINCLUDES | CPP包含目录列表,Unix使用:空格或:分格。 |
HASHBANGPERL | Perl调用被插入在'#!'在公共perl脚本(仅在Unix上相关) |
LD | 程序链接器(在Unix上不使用,这里使用$(CC))。 |
LDFLAGS | 共享库、DSO和程序链接器的标志 |
LDLIBS | 链接时使用的额外库,Unix上采用空格分隔的库规范列表的形式 |
RANLIB | 库归档索引器 |
RC | Windows资源编译器 |
RCFLAGS | Windows资源编译器的标志 |
RM | 删除文件和目录的命令 |
这些不能与命令行上给出的编译/链接标志混合
若设置CC
,建议也设置CXX
。
将先前的数据重新配置
这将从configdata. pm
中保存的数据中获取之前的命令行选项和环境,并使用这些选项和环境再次运行配置过程。
注意:
其他选项不能和’ reconf '一起使用。
原始配置保存了所使用的所有环境变量的值,如果它们没有定义,它们仍然保存了它们最初没有定义的信息。此信息优先于重新配置时定义的环境变量。
reconf
reconfigure
配置脚本本身描述得很少,并通过创建’ configdata.pm '完成。这个perl模块可以由其他脚本加载,以查找所有配置数据,它还可以用作脚本,以人类可读的形式显示所有类型的配置数据。
$ ./configdata. pm --help # Unix
找到安装目录,执行指令:tree -d
. ├── bin #包含openssl二进制文件和一些其他实用程序脚本 ├── include │ └── openssl #包含需要的头文件,如果您想构建自己的程序使用libcrypto或libssl ├── lib64 # OpenSSL库文件 │ ├── engines-3 # OpenSSL动态加载引擎 │ ├── ossl-modules │ └── pkgconfig ├── share │ ├── doc #包含手册页的HTML呈现 │ │ └── openssl │ │ └── html │ │ ├── man1 │ │ ├── man3 │ │ ├── man5 │ │ └── man7 │ │ └── img │ └── man │ ├── man1 #OpenSSL命令行手册页。 │ ├── man3 #包含OpenSSL库调用手册页 │ ├── man5 # OpenSSL配置格式手册页 │ └── man7 #包含OpenSSL其他各种手册页 └── ssl ├── certs # 最初为空,这是证书文件的默认位置 ├── misc # 不同的脚本 └── private # 最初为空,这是私钥文件的默认位置。
注意:安装目录应该得到适当的保护,以确保没有特权的用户不能更改OpenSSL二进制文件或文件,也不能安装引擎。如果您已经有一个预安装的OpenSSL版本作为您的操作系统的一部分,建议您不要覆盖该系统版本,而是将其安装到其他地方
希望将库配置为标准位置,但将包安装在其他地方以便容易打包的包构建者可以使用
指定的目标目录将预放在所有安装目标路径上。
make DESTDIR=/tmp/package-root
下面还有环境变量的具体描述
make工具中的目标解释。
建议详细在查看该文档,此处仅简要描述。
OpenSSL使用编译器链接程序和共享库
OpenSSL生成的Makefile使用C编译器命令行链接程序、共享库和可动态加载的共享对象。
因此,提供给配置脚本的任何链接选项必须是编译器可以接受的形式。这在不同的系统之间有所不同,有些系统的编译器直接接受链接标志,而另一些系统则采用-Wl
形式。
您需要阅读编译器文档,以确定什么是可接受的,并’ ld(1) ‘,以确定哪些链接器选项是可用的。
共享库和安装在非默认位置
每个Unix系统都有自己的共享库默认位置集,例如/lib
、/usr/lib
或可能的/usr/local/lib
。如果库安装在非默认位置,动态链接的二进制文件将找不到它们,因此无法运行,除非它们从定义的运行时共享库搜索路径获得一些帮助。
对于OpenSSL的应用程序(’ OpenSSL’命令),我们的配置脚本通常不会为您设置运行时共享库搜索路径。因此,建议在配置时显式地设置它,除非将库安装在您知道位于默认列表中的目录中。
运行时共享库搜索路径由不同的操作系统和版本指定,并在各自的文档中进行了不同的讨论;RPATH
的变量是最常见的(注意:ELF系统有两个这样的标记,下面有更多)。
设置运行时共享库搜索路径的可能选项包括:
-Wl,-rpath,/whatever/path # Linux, *BSD, etc.
OpenSSL的配置脚本能够识别所有这些选项,并将它们传递给所构建的Makefile。(事实上,所有以-Wl
开头的参数都被识别为链接器选项。)请注意-Wl
中的l
是小写的l
而不是1
。
请不要在运行时共享库搜索路径中使用逐字目录!一些OpenSSL配置目标为多库安装添加了额外的目录级别。为了帮助实现这一点,生成的makefile包含了变量LIBRPATH
,这是一个方便的变量,可与运行时共享库搜索路径选项一起使用,如下例所示:
$ ./Configure --prefix=/usr/local/ssl --openssldir=/usr/local/ssl '-Wl,-rpath,$(LIBRPATH)'
在现代基于ELF的系统上,需要考虑两个运行时搜索路径标记,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
被默认设置,这取决于系统。例如,根据文档,DT_RPATH
在Solaris上似乎不赞成使用DT_RUNPATH
,而在Debian GNU/Linux上,两者都可以设置,DT_RPATH
是写入时的默认值。
如何选择要设置的运行时搜索路径标签取决于您的系统,请参考ld(1)以获得关于您系统的确切信息。例如,确保DT_RUNPATH
在Debian GNU/Linux系统上设置而不是DT_RPATH
的方法是告诉链接器设置新的dtags,如下所示:
$ ./Configure --prefix=/usr/local/ssl --openssldir=/usr/local/ssl '-Wl,--enable-new-dtags,-rpath,$(LIBRPATH)'
值得注意的是,一些/大多数ELF系统通过解释$ORIGIN
和其他一些内部变量,实现了相对于包含当前可执行文件的目录的运行时搜索路径的支持。参考您的系统文档。
连接您的应用程序
动态链接OpenSSL(或任何其他)共享库的第三方应用程序在非默认位置也面临完全相同的问题。上面提到的OpenSSL配置选项可能对目标应用程序的链接有影响,也可能没有影响。“Might”意味着在某些情况下,“自然地”链接OpenSSL共享库就足够了,即使用“-L/whatever/path -lssl -lcrypto”。但也有一些情况,当链接应用程序时,您必须显式地指定运行时搜索路径。参考你的系统文档并使用上面的章节作为灵感…
共享OpenSSL构建还安装静态库。与后者的链接可能需要特别注意,因为链接器通常首先查找共享库,并且倾向于对静态OpenSSL库保持“盲”。如果不是为了特殊情况,参考系统文档就足够了。在AIX静态库(在共享构建中)的命名是不同的,添加’ _a '后缀来链接它们,例如。“-lcrypto_a”。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。