Chinaunix首页 | 论坛 | 博客
  • 博客访问: 182387
  • 博文数量: 115
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2016-01-11 17:10
个人简介

路漫漫其修远兮,吾将上下而求索!

文章分类
文章存档

2016年(115)

我的朋友

分类: LINUX

2016-01-12 11:02:22

原文地址:Cross Compile openssl 作者:tekkamanninja

安全套接层(Secure Sockets Layer,SSL)及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议,而openssl是它的软件实现。在许多时候编译有关网络安全的软件都要用到openssl库。下面介绍一下这个库的交叉编译过程。

1、软件下载:
官方下载:
备用下载:

2、依赖库:zlib交叉编译
编译时需要它的头文件。

3、解压
tar xzvf openssl-1.0.0b.tar.gz

4、配置脚本
#!/bin/sh
#tekkamanninja
CROSS_COMPILE=(你的交叉编译工具链前缀)
PREFIX=(编译好的库安装路径,最好是绝对路径)
    CC=${CROSS_COMPILE}gcc AR="${CROSS_COMPILE}ar ${ARFLAGS}" RANLIB=${CROSS_COMPILE}ranlib ./Configure --prefix=${PREFIX}   -I(zlib.h头文件的目录,必须是绝对路径)  threads  shared zlib-dynamic  linux-armv4

5、编译
make 
make install


6、实践中遇到的问题
在编译的时候遇到一个极其郁闷的问题,就是关于“os/compiler[:flags]”的问题。
在配置前,我先参考了网上的资料,这一参考就被误导了。很多参考资料对于这个配置的使用类似“os/compiler:arm-9tdmi-linux-gnu-gcc”,想当然的以为这个“os/compiler[:flags]”是用来配置交叉编译工具用的。这样的配置可以确定交叉编译工具,但是也导致无法编译出共享库文件(.so)。其实这个是一种误用!!
现在我们来认真看看配置帮助文件是怎么说的:

$ ./Configure -h
Configuring for 
Usage: Configure [no- ...] [enable- ...] [experimental- ...] [-Dxxx] [-lxxx] [-Lxxx] [-fxxx] [-Kxxx] [no-hw-xxx|no-hw] zlib-dynamic] [no-asm] [no-dso] [no-krb5] [386] [--prefix=DIR] [--openssldir=OPENSSLDIR] [--with-xxx[=vvv [--test-sanity] os/compiler[:flags]

pick os/compiler from:
BC-32 BS2000-OSD BSD-generic32 BSD-generic64 BSD-ia64 BSD-sparc64 BSD-sparcv8 
BSD-x86 BSD-x86-elf BSD-x86_64 Cygwin Cygwin-pre1.3 DJGPP MPE/iX-gcc OS2-EMX 
OS390-Unix QNX6 QNX6-i386 ReliantUNIX SINIX SINIX-N UWIN VC-CE VC-WIN32 
VC-WIN64A VC-WIN64I aix-cc aix-gcc aix3-cc aix64-cc aix64-gcc aux3-gcc 
beos-x86-bone beos-x86-r5 bsdi-elf-gcc cc cray-j90 cray-t3e darwin-i386-cc 
darwin-ppc-cc darwin64-ppc-cc darwin64-x86_64-cc dgux-R3-gcc dgux-R4-gcc 
dgux-R4-x86-gcc dist gcc hpux-cc hpux-gcc hpux-ia64-cc hpux-ia64-gcc 
hpux-parisc-cc hpux-parisc-cc-o4 hpux-parisc-gcc hpux-parisc1_0-cc 
hpux-parisc2-cc hpux-parisc2-gcc hpux64-ia64-cc hpux64-ia64-gcc 
hpux64-parisc2-cc hpux64-parisc2-gcc hurd-x86 irix-cc irix-gcc irix-mips3-cc 
irix-mips3-gcc irix64-mips4-cc irix64-mips4-gcc linux-alpha+bwx-ccc 
linux-alpha+bwx-gcc linux-alpha-ccc linux-alpha-gcc linux-aout linux-armv4 
linux-elf linux-generic32 linux-generic64 linux-ia32-icc linux-ia64 
linux-ia64-ecc linux-ia64-icc linux-ppc linux-ppc64 linux-s390x linux-sparcv8 
linux-sparcv9 linux-x86_64 linux64-sparcv9 mingw mingw64 ncr-scde netware-clib 
netware-clib-bsdsock netware-clib-bsdsock-gcc netware-clib-gcc netware-libc 
netware-libc-bsdsock netware-libc-bsdsock-gcc netware-libc-gcc newsos4-gcc 
nextstep nextstep3.3 osf1-alpha-cc osf1-alpha-gcc purify qnx4 rhapsody-ppc-cc 
sco5-cc sco5-gcc solaris-sparcv7-cc solaris-sparcv7-gcc solaris-sparcv8-cc 
solaris-sparcv8-gcc solaris-sparcv9-cc solaris-sparcv9-gcc solaris-x86-cc 
solaris-x86-gcc solaris64-sparcv9-cc solaris64-sparcv9-gcc solaris64-x86_64-cc 
solaris64-x86_64-gcc sunos-gcc tandem-c89 tru64-alpha-cc uClinux-dist 
uClinux-dist64 ultrix-cc ultrix-gcc unixware-2.0 unixware-2.1 unixware-7 
unixware-7-gcc vos-gcc vxworks-mipsle vxworks-ppc405 vxworks-ppc750 
vxworks-ppc750-debug vxworks-ppc860 debug debug-BSD-x86-elf debug-Cygwin 
debug-VC-WIN32 debug-VC-WIN64A debug-VC-WIN64I debug-ben debug-ben-debug 
debug-ben-no-opt debug-ben-openbsd debug-ben-openbsd-debug debug-ben-strict 
debug-bodo debug-darwin-i386-cc debug-darwin-ppc-cc debug-geoff32 
debug-geoff64 debug-levitte-linux-elf debug-levitte-linux-elf-extreme 
debug-levitte-linux-noasm debug-levitte-linux-noasm-extreme debug-linux-elf 
debug-linux-elf-noefence debug-linux-generic32 debug-linux-generic64 
debug-linux-ia32-aes debug-linux-pentium debug-linux-ppro debug-linux-x86_64 
debug-rse debug-solaris-sparcv8-cc debug-solaris-sparcv8-gcc 
debug-solaris-sparcv9-cc debug-solaris-sparcv9-gcc debug-steve-opt 
debug-steve32 debug-steve64 debug-ulf debug-vos-gcc 

NOTE: If in doubt, on Unix-ish systems use './config'.
-----------------------
 os/compiler[:flags] :大家看看冒号后面的是什么!是flags,并不是crosstool什么的,这说明了冒号后面是编译标志什么的,并不是我们原以为的交叉编译工具链。

 “pick os/compiler from:”这句说明了用下面的一堆东西,选一个来替换os/compiler。我编译的是arm构架的库,所以我选择了 “linux-armv4”。我不需要一些特殊的标志,所以后面我不带冒号和flags了。而这个设置的确可以确定编译工具,但是可以被“CC=“覆盖的。它主要的功能是确定一些编译选项,包括是否支持共享库的编译。而网上的一些错误的配置和无法编译出共享库的问题就在这里,如果你用了类似“os/compiler:arm-9tdmi-linux-gnu-gcc“的错误方法,那么就不是在上面的一堆东西选出的,系统找不到匹配的项,默认就不支持共享库的编译。具体的实现请用vi来看Configure文件就知道了。

就是因为我用了错误的配置,没有获得我要的共享库,我才去找原因,看配置脚本,并在同事的帮助下找到的问题。
这件事说明了认真看帮助文件是很重要的,出了问题google没有错,但是不要去过分相信别人的参考,老虎也有打盹的时候。

著名的《构建嵌入式Linux系统》中关于Openssl的交叉编译也是错的,那样是编译不出共享库的。正确编译老版本0.9.6g的方法如下:
1、修改Configure文件
"linux-elf-arm","gcc:-DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::BN_LLONG::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
修改为
"linux-elf-arm","arm_v5t_le-gcc:-DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::BN_LLONG::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",

2、配置脚本
CROSS_COMPILE=(你的交叉编译工具链前缀)
PREFIX=(编译好的库安装路径,最好是绝对路径)
    CC=${CROSS_COMPILE}gcc AR="${CROSS_COMPILE}ar ${ARFLAGS}" RANLIB=${CROSS_COMPILE}ranlib  ./Configure --prefix=${PREFIX}   -I(zlib.h头文件的目录,必须是绝对路径)   threads  shared  linux-elf-arm

OK,既然编译出了openssl库,这就大功告成了。但是我觉得借此机会更好的去了解ssl、ssh以及这些加密通信的原理也非常的总要,下面是一些很好的参考资料,希望对大家有帮助:
OpenSSL概述(《OpenSSL 与网络信息安全——基础、结构和指令》的第十三章,网上有PDF下载)
OpenCA体系结构 (网上有PDF下载)
公钥基础设施PKI 简介(网上有PDF下载)

阅读(934) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~