openssl 的编译(linux、Ubuntu) 和 交叉编译(arm、Hi3531A)的问题分析、解决
目錄
一、編譯環(huán)境及準(zhǔn)備材料
二、Ubuntu下編譯openssl
三、交叉編譯 openssl
一、編譯環(huán)境及準(zhǔn)備材料
1、編譯環(huán)境:
1.1、Ubuntu環(huán)境 - ubuntu?14.04.1
$ uname -a Linux ubuntu 4.4.0-128-generic #154~14.04.1-Ubuntu SMP Fri May 25 14:58:51 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux1.2、交叉編譯器
$ arm-hisiv100nptl-linux-gcc -v Using built-in specs. Target: arm-hisiv100-linux-uclibcgnueabi Configured with: ../gcc-4.4-2010q1/configure --host=i486-linux-gnu --build=i486-linux-gnu --target=arm-hisiv100-linux-uclibcgnueabi --prefix=/home/sying/uclibc_h3/hisiv100_finalnptl_src/hisiv100_src/install/arm-hisiv100-linux ... ... Thread model: posix gcc version 4.4.1 (Hisilicon_v100(gcc4.4-290+uclibc_0.9.32.1+eabi+linuxpthread))2、openssl 源碼
openssl 官網(wǎng)源碼下載
openssl有提供舊版本源碼下載,我這里下載的是?openssl-1.1.0l.tar.gz
二、Ubuntu下編譯openssl
在Ubuntu下編譯,沒有遇到報錯的地方,只需要配置好輸出目錄即可。
將源碼壓縮包/home/samba/openssl/ 目錄后,解壓并創(chuàng)建 ssl_result_ubuntu 用來存放編譯結(jié)果,進(jìn)入源碼目錄執(zhí)行 config 文件生成Makefile,用 --prefix?來指定openssl的安裝目錄,然后直接編譯,過程如下:
ubuntu:/home/samba/openssl$ tar zxf openssl-1.1.0l.tar.gz ubuntu:/home/samba/openssl$ mkdir ssl_result_ubuntu ubuntu:/home/samba/openssl$ cd openssl-1.1.0l/ ubuntu:/home/samba/openssl/openssl-1.1.0l$ ./config --prefix=/home/samba/openssl/ssl_result_ubuntu ubuntu:/home/samba/openssl/openssl-1.1.0l$ make ubuntu:/home/samba/openssl/openssl-1.1.0l$ make install ubuntu:/home/samba/openssl/openssl-1.1.0l$ ls ../ssl_result_ubuntu/ bin include lib share ssl三、交叉編譯 openssl
1、配置、編譯
交叉編譯過程中出現(xiàn)比較多問題,問題集中在執(zhí)行 config 生成 Makefile 的過程中,下面列出問題及解決方案。
將源碼壓縮包/home/samba/openssl/ 目錄后,解壓并創(chuàng)建 ssl_result_3531A 用來存放編譯結(jié)果,進(jìn)入源碼目錄執(zhí)行 config 文件生成Makefile,用 --prefix 來指定 openssl 的安裝目錄,然后再使用 --cross-compile-prefix 來指定交叉編譯工具前綴,接著編譯出現(xiàn)錯誤,過程如下:
ubuntu:/home/samba/openssl$ tar zxf openssl-1.1.0l.tar.gz ubuntu:/home/samba/openssl$ mkdir ssl_result_3531A ubuntu:/home/samba/openssl$ cd openssl-1.1.0l/ ubuntu:/home/samba/openssl/openssl-1.1.0l$ ./config --prefix=/home/samba/openssl/ssl_result_3531A --cross-compile-prefix=arm-hisiv100nptl-linux- ubuntu:/home/samba/openssl/openssl-1.1.0l$ make ... PIC -DOPENSSL_USE_NODELETE -c -o crypto/aes/aes-x86_64.o crypto/aes/aes-x86_64.s crypto/aes/aes-x86_64.s: Assembler messages: crypto/aes/aes-x86_64.s:2: Error: unrecognized symbol type "" crypto/aes/aes-x86_64.s:3: Error: alignment too large: 15 assumed crypto/aes/aes-x86_64.s:5: Error: bad instruction `xorl 0(%r15),%eax' crypto/aes/aes-x86_64.s:6: Error: bad instruction `xorl 4(%r15),%ebx' crypto/aes/aes-x86_64.s:7: Error: bad instruction `xorl 8(%r15),%ecx' ...2、分析問題,加?no-asm 配置選項
問題分析:從錯誤打印看到,錯誤出現(xiàn)在編譯 .s 文件(匯編文件)時,且后面還打印了匯編代碼。原來 openssl 在編譯時會默認(rèn)使用匯編代碼來加速編譯過程,但只針對 x86平臺,而 x86平臺 的匯編代碼和 arm平臺 的匯編代碼是不同的,所以會報錯。
解決方案:執(zhí)行 config 時,加上?no-asm 表示不使用匯編代碼加速編譯。
繼續(xù)編譯:重新生成 Makefiel,重新編譯,出現(xiàn)錯誤,過程如下:
ubuntu:/home/samba/openssl/openssl-1.1.0l$ ./config no-asm --prefix=/home/samba/openssl/ssl_result_3531A --cross-compile-prefix=arm-hisiv100nptl-linux- ubuntu:/home/samba/openssl/openssl-1.1.0l$ make clean && make 省略無關(guān)打印... F crypto/aes/aes_cbc.d.tmp -MT crypto/aes/aes_cbc.o -c -o crypto/aes/aes_cbc.o crypto/aes/aes_cbc.c cc1: error: unrecognized command line option "-m64" make[1]: *** [crypto/aes/aes_cbc.o] Error 1 省略無關(guān)打印...3、分析問題,刪除 Makefile 的 -m64
問題分析:錯誤打印表示 "-m64" 無法識別。查資料得知,-m64是x86 64位應(yīng)用編譯選項,m64選項設(shè)置int為32 bits及l(fā)ong指針為64 bits,為AMD的x86 64架構(gòu)生成代碼。所以,在arm平臺無法支持。
解決方案:刪除?Makefile 的兩處 -m64,可以使用下面命令刪除,也可以打開Makefile,搜索刪除。
sed -i 's/-m64//' Makefile繼續(xù)編譯:修改 Makefile 后,重新編譯,出現(xiàn)錯誤如下:
./libcrypto.so: undefined reference to `getcontext' ./libcrypto.so: undefined reference to `setcontext' ./libcrypto.so: undefined reference to `makecontext'4、分析問題,加?no-async 配置選項,編譯通過
問題分析:查資料得知,這個錯誤是編譯時缺少?ucontext 庫(?ucontext提供的四個函數(shù)getcontext、setcontext、makecontext、swapcontext、可以在一個進(jìn)程中實現(xiàn)用戶級的線程切換)。海思3531A平臺的交叉編譯工具沒有提供GNU?C的 ucontext 庫,所以出錯。
解決方案:執(zhí)行 config 時,加上?no-async,不使用?ucontext 庫
繼續(xù)編譯:加上?no-async,重新生成Makefile,編譯通過,過程如下:
ubuntu:/home/samba/openssl/openssl-1.1.0l$ ./config no-asm no-async --prefix=/home/samba/openssl/ssl_result_3531A --cross-compile-prefix=arm-hisiv100nptl-linux- ubuntu:/home/samba/openssl/openssl-1.1.0l$ sed -i 's/-m64//' Makefile ubuntu:/home/samba/openssl/openssl-1.1.0l$ make clean && make && make install ubuntu:/home/samba/openssl/openssl-1.1.0l$ ls ../ssl_result_3531A/ bin include lib share ssl到此,編譯完成,在指定的安裝目錄下,生成了對應(yīng)的頭文件和庫文件。
另外,關(guān)于 openssl 的配置選項 no-asm、no-async,在上文已經(jīng)講清楚了,而對其他配置選項感興趣的可以查看?openssl編譯參數(shù)選項。
如果文章能解決你的問題,留個贊讓我知道一下 ^_^
總結(jié)
以上是生活随笔為你收集整理的openssl 的编译(linux、Ubuntu) 和 交叉编译(arm、Hi3531A)的问题分析、解决的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三星智能手表取得快速增长,华为和小米则以
- 下一篇: Linux防火墙firewalld安全设