引:平台基于Atmel AT91RM9200-DK,工具链是第三方提供,在工作中有需要用到TS(time server),而TS基于NTP(Network Time Protocal)协议,NTP官方有给出的NTP协议包,其他的厂商实现都是基于这个包来实现部署自己的TS。NTP的协议包包括协议实现库、NTP服务、NTP客户端以及其他辅助工具。NTP协议实现处于安全的考虑,需要基于SSL工作,需要基于新版本openssl才能工作,,而现有的基于openssl 0.98的实现,在编译上无法通过。基于以上考虑,就需要用现有的工具链,编译出一份openssl 1.1.0e的库。
现有的工具链是基于cygwin 32工作的,所以要解决的是在cygwin下做openssl 1.1.0e的交叉编译。
关键的编译配置如下:
1.展开openssl 1.1.0e
#tar xzvf openssl-1.1.0e.tar.gz
2.配置编译环境
$ ls /usr/local/arm/3.3.4/bin/
arm-linux-addr2line.exe arm-linux-c++.exe arm-linux-g++.exe arm-linux-gccbug arm-linux-nm.exe arm-linux-ranlib.exe arm-linux-strings.exe
arm-linux-ar.exe arm-linux-c++filt.exe arm-linux-gcc.exe arm-linux-gcov.exe arm-linux-objcopy.exe arm-linux-readelf.exe arm-linux-strip.exe
arm-linux-as.exe arm-linux-cpp.exe arm-linux-gcc-3.3.4 arm-linux-ld.exe arm-linux-objdump.exe arm-linux-size.exe test.c
#export PATH=$PATH:/usr/local/arm/3.3.4/bin/
$ ./configure linux-armv4 no-asm shared --prefix=http://www.mamicode.com/usr/local/arm-ssl
此命令会将openssl的编译目标配置为基于arm处理器的linux版本,如果不是这个配置,在变医德过程中会遇到平台相关的变异问题,如pthread的库编译。(注:如果不用linux-armv4配置,而用--host=arm-linux之类的陪着,可是会报错的哦)
$vi Makefile
因为configure是并没有指定工具链的信息(编译器名称、头文件路径、库路径、sysroot),configure脚本生成的Makefile和工具链并不匹配,需要手动修改Makfile。修改的项目如下:
1)交叉编译器前缀
CROSS_COMPILE=
修改为
CROSS_COMPILE= arm-linux-
2)编译参数,增加一句命令
CFLAGS+=-I/usr/local/arm/3.3.4/arm-linux/sys-root/usr/include
3)链接参数
LDFLAGS=
修改为
LDFLAGS=-L/usr/local/arm/3.3.4/arm-linux/sys-root/lib -L/usr/local/arm/3.3.4/arm-linux/sys-root/usr/lib --with-sysroot=http://www.mamicode.com/usr/local/arm/3.3.4/arm-linux/sys-root
注:
* CLFALGS和LDFLAGS的值,需要参考交叉工具链的路径,我的工具里安放在/usr/local/arm/3.3.4/arm-linux/目录下,sysroot的路径是/usr/local/arm/3.3.4/arm-linux/sys-root。
* 指定好编译器,还需要制定PATH,否则make时,会找不到编译器。
3.修改部分文件。
编译过程中,部分文件和工具链不相配,需要略作改动。
1) 文件crypto\threads_pthread.c
line 36: pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
修改为
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE_NP);
天津BU的工具链所附带的pthread库头文件,并没有直接提供PTHREAD_MUTEX_RECURSIVE的定义,需要一个宏__USE_UNIX98才行,为快速验证编译,所以直接赋值PTHREAD_MUTEX_RECURSIVE_NP。
附pthread库的定义源码:
enum
{
PTHREAD_MUTEX_TIMED_NP,
PTHREAD_MUTEX_RECURSIVE_NP,
PTHREAD_MUTEX_ERRORCHECK_NP,
PTHREAD_MUTEX_ADAPTIVE_NP
#ifdef __USE_UNIX98
,
PTHREAD_MUTEX_NORMAL = PTHREAD_MUTEX_TIMED_NP,
PTHREAD_MUTEX_RECURSIVE = PTHREAD_MUTEX_RECURSIVE_NP,
PTHREAD_MUTEX_ERRORCHECK = PTHREAD_MUTEX_ERRORCHECK_NP,
PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL
#endif
#ifdef __USE_GNU
/* For compatibility. */
, PTHREAD_MUTEX_FAST_NP = PTHREAD_MUTEX_ADAPTIVE_NP
#endif
};
2.修改工具链的fcntl.h
在openssl中有用到O_TEXT、O_BINARY,是setmode的参数用到,是C库的标准定义,但是工具链并没有提供这样的定义声明。查阅标准库,这两个宏是在fcntl.h包含的sys/_default_fcntl.h文件里声明的。交叉工具链的fcntl.h的并无包含sys/_default_fcntl.h,所以在fcntl.h里手动添加。添加代码如下:
#ifndef O_TEXT
#define _FBINARY 0x10000
#define _FTEXT 0x20000
#define _FNOINHERIT 0x40000
#define _FDIRECT 0x80000
#define _FNOFOLLOW 0x100000
#define _FDIRECTORY 0x200000
#define _FEXECSRCH 0x400000
#define O_BINARY _FBINARY
#define O_TEXT _FTEXT
#define O_CLOEXEC _FNOINHERIT
#define O_DIRECT _FDIRECT
#define O_NOFOLLOW _FNOFOLLOW
#define O_DSYNC _FSYNC
#define O_RSYNC _FSYNC
#define O_DIRECTORY _FDIRECTORY
#define O_EXEC _FEXECSRCH
#define O_SEARCH _FEXECSRCH
#endif
至此,遇到的问题基本解决,剩下的东西就简单了,直接make和make install。
make install的话,会将生成的库、工具、文档安装到--prefix指定的目录下。
注:
1.make大约需要30+分钟,我的是机器是i3-21203.30GHZ,内存4GB,win7 64的系统。
2.make install 更久,2小时还没有完,主要是安装文档。