引:平台基于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.gz2.配置编译环境$ 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.exearm-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.exearm-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=/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/include3)链接参数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=/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.cline 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小时还没有完,主要是安装文档。