说明
  本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。

编译构建 简单描述(INSTALL.md)

1.源代码下载

  方式一:git下载
    执行命令:git clone https://github.com/openssl/openssl.git   方式二:官网下载
    openssl官网下载地址

2.编译环境支持:

  1.make工具
  2.perl及其相关模组
  3.ANSI C编译器
  4.C的开发环境
  5.支持的操作系统

3.构建openssl

  Linux:

$ ./Configure
    $ make
    $ make test
4.安装openssl

  建议:
    1.出于安全考虑:默认安装地址为/usr/local下,该位置默认不可写,故需切换为权限用户
    2.若某些平台自带openssl,建议不要覆盖,因为其他应用可能依赖。
    (故安装在不同位置,非系统库的全局搜索路径)
  Linux:(需加sudo

make install
5.配置选项:

  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文档。

6.脚本的环境配置选项

  与普通环境变量赋值相同,但在所有平台都支持,并仅限配置脚本。
  若有相同环境变量,则会覆盖掉,选项有:

环境变量

说明

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

7.重新配置

  将先前的数据重新配置
  这将从configdata. pm中保存的数据中获取之前的命令行选项和环境,并使用这些选项和环境再次运行配置过程。
  注意:
    其他选项不能和’ reconf '一起使用。
    原始配置保存了所使用的所有环境变量的值,如果它们没有定义,它们仍然保存了它们最初没有定义的信息。此信息优先于重新配置时定义的环境变量。

reconf 
reconfigure
8.显示配置数据

  配置脚本本身描述得很少,并通过创建’ configdata.pm '完成。这个perl模块可以由其他脚本加载,以查找所有配置数据,它还可以用作脚本,以人类可读的形式显示所有类型的配置数据。

$ ./configdata. pm --help                         # Unix
9.安装目录介绍

  找到安装目录,执行指令: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版本作为您的操作系统的一部分,建议您不要覆盖该系统版本,而是将其安装到其他地方

10.打包

  希望将库配置为标准位置,但将包安装在其他地方以便容易打包的包构建者可以使用
  指定的目标目录将预放在所有安装目标路径上。

make DESTDIR=/tmp/package-root

  

其他

  下面还有环境变量的具体描述
  make工具中的目标解释。
  建议详细在查看该文档,此处仅简要描述。

NOTES-UNIX.md(看此翻译更优

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_RPATHDT_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”。