1. 程式人生 > >Cygwin交叉編譯openssl 1.1.0e版本

Cygwin交叉編譯openssl 1.1.0e版本

openssl cygwin 交叉編譯 ntp


引:平臺基於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=/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=/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小時還沒有完,主要是安裝文檔。


本文出自 “一些想法” 博客,請務必保留此出處http://wangyw.blog.51cto.com/4075460/1928514

Cygwin交叉編譯openssl 1.1.0e版本