openssl 的编译(linux、Ubuntu) 和 交叉编译(arm、Hi3531A)的问题分析、解决

简介: openssl 的编译(linux、Ubuntu) 和 交叉编译(arm、Hi3531A)的问题分析、解决

一、编译环境及准备材料

1、编译环境:

1.1、Ubuntu环境 - 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/Linux

1.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 官网源码下载

openssl有提供旧版本源码下载,我这里下载的是 openssl-1.1.0l.tar.gz


二、Ubuntu下编译openssl

在Ubuntu下编译,没有遇到报错的地方,只需要配置好输出目录即可。

将源码压缩包/home/samba/openssl/ 目录后,解压并创建 ssl_result_ubuntu 用来存放编译结果,进入源码目录执行 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、配置、编译

交叉编译过程中出现比较多问题,问题集中在执行 config 生成 Makefile 的过程中,下面列出问题及解决方案。

将源码压缩包/home/samba/openssl/ 目录后,解压并创建 ssl_result_3531A 用来存放编译结果,进入源码目录执行 config 文件生成Makefile,用 --prefix 来指定 openssl 的安装目录,然后再使用 --cross-compile-prefix 来指定交叉编译工具前缀,接着编译出现错误,过程如下:

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 配置选项

问题分析:从错误打印看到,错误出现在编译 .s 文件(汇编文件)时,且后面还打印了汇编代码。原来 openssl 在编译时会默认使用汇编代码来加速编译过程,但只针对 x86平台,而 x86平台 的汇编代码和 arm平台 的汇编代码是不同的,所以会报错。

解决方案:执行 config 时,加上 no-asm 表示不使用汇编代码加速编译。

继续编译:重新生成 Makefiel,重新编译,出现错误,过程如下:

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 
省略无关打印...
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
省略无关打印...

3、分析问题,删除 Makefile 的 -m64

问题分析:错误打印表示 "-m64" 无法识别。查资料得知,-m64是x86 64位应用编译选项,m64选项设置int为32 bits及long指针为64 bits,为AMD的x86 64架构生成代码。所以,在arm平台无法支持。

解决方案:删除 Makefile 的两处 -m64,可以使用下面命令删除,也可以打开Makefile,搜索删除。

sed -i 's/-m64//' Makefile

继续编译:修改 Makefile 后,重新编译,出现错误如下:

./libcrypto.so: undefined reference to `getcontext'
./libcrypto.so: undefined reference to `setcontext'
./libcrypto.so: undefined reference to `makecontext'

4、分析问题,加 no-async 配置选项,编译通过

问题分析:查资料得知,这个错误是编译时缺少 ucontext 库(ucontext提供的四个函数getcontext、setcontext、makecontext、swapcontext、可以在一个进程中实现用户级的线程切换)。海思3531A平台的交叉编译工具没有提供GNU C的 ucontext 库,所以出错。

解决方案:执行 config 时,加上 no-async,不使用 ucontext 库

继续编译:加上 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

到此,编译完成,在指定的安装目录下,生成了对应的头文件和库文件。

另外,关于 openssl 的配置选项 no-asm、no-async,在上文已经讲清楚了,而对其他配置选项感兴趣的可以查看 openssl编译参数选项

如果文章能解决你的问题,留个赞让我知道一下 ^_^

目录
相关文章
|
8月前
|
Ubuntu Linux UED
Ubuntu和Debian系统与Hat Linux系列的使用比较
所以,如果你想搞一个家用服务器,或者是个人使用,喜欢新鲜事物,那Ubuntu可能是你的最好选择。如果你需要一个在商业环境中经受住考验的系统,那Fedora或CentOS可能更符合你的口味。不过记住,CentOS现在是CentOS Stream,中途换马了,所以如果你是稳定性的极端追求者,可能得考虑一下这一变化。而Debian,则适合那些对稳定性需求极高,不太追求软件版本新旧的用户。
270 26
|
8月前
|
Ubuntu 搜索推荐 Linux
Ubuntu/Debian Hat系Linux的便捷操作指南
总的来说,虽然Ubuntu/Debian和Red Hat系列在操作方法上有所不同,但基本概念类似。掌握了包管理和服务管理,可以应对大多数常见的系统管理任务。同时,这两个系统都有丰富的在线资源可以查询,不管你在任务中遇到什么困难,搜索引擎都能帮你找到答案。这些基本技能能让你在Linux的世界里更加自如。
251 26
|
8月前
|
Ubuntu Linux Shell
Linux环境下VSCode快速安装终极指南:debian/ubuntu/linux平台通用
以上就是在Linux环境下安装VSCode的终极指南,抛开繁复的专业词汇,以平易近人的文字、形象生动的比喻让你轻松学会这一过程。别忘了,你的小伙伴VSCode已经在应用菜单里等你了!
2457 23
|
11月前
|
Ubuntu 安全 Linux
Linux错误排查:解决Ubuntu 20.4执行sudo apt-get update时出现的libnettle.so.6错误。
很有可能在你得到解决方案时,你也学到了不少Linux修复技巧。祝你处理计算机问题时顺利如麻!永远记得,各种问题总是像老鼠一样从意想不到的地方冒出来。但记住,不管它们跑到哪里,最终都逃不过你的捕鼠器。盖起你的计算机,拾起你的代码,大步向前!
350 28
|
11月前
|
Ubuntu 安全 Linux
Linux错误排查:解决Ubuntu 20.4执行sudo apt-get update时出现的libnettle.so.6错误。
很有可能在你得到解决方案时,你也学到了不少Linux修复技巧。祝你处理计算机问题时顺利如麻!永远记得,各种问题总是像老鼠一样从意想不到的地方冒出来。但记住,不管它们跑到哪里,最终都逃不过你的捕鼠器。盖起你的计算机,拾起你的代码,大步向前!
332 18
|
12月前
|
缓存 Ubuntu Linux
Linux中yum、rpm、apt-get、wget的区别,yum、rpm、apt-get常用命令,CentOS、Ubuntu中安装wget
通过本文,我们详细了解了 `yum`、`rpm`、`apt-get`和 `wget`的区别、常用命令以及在CentOS和Ubuntu中安装 `wget`的方法。`yum`和 `apt-get`是高层次的包管理器,分别用于RPM系和Debian系发行版,能够自动解决依赖问题;而 `rpm`是低层次的包管理工具,适合处理单个包;`wget`则是一个功能强大的下载工具,适用于各种下载任务。在实际使用中,根据系统类型和任务需求选择合适的工具,可以大大提高工作效率和系统管理的便利性。
1394 25
|
Ubuntu Linux Go
golang编译成Linux可运行文件
本文介绍了如何在 Linux 上编译和运行 Golang 程序,涵盖了本地编译和交叉编译的步骤。通过这些步骤,您可以轻松地将 Golang 程序编译成适合 Linux 平台的可执行文件,并在目标服务器上运行。掌握这些技巧,可以提高开发和部署 Golang 应用的效率。
2411 14
|
负载均衡 Ubuntu 应用服务中间件
nginx修改网站默认根目录及发布(linux、centos、ubuntu)openEuler软件源repo站点
通过合理配置 Nginx,我们可以高效地管理和发布软件源,为用户提供稳定可靠的服务。
1581 13
|
Ubuntu 芯片 开发者
Ubuntu 25 ARM 桌面系统抢先版发布:第一个Ubuntu ARM桌面系统
Ubuntu 25.04 将于2025年发布,首次支持ARM Desktop桌面版系统,为ARM架构设备如Mac M系列芯片、Raspberry Pi等带来全新的桌面体验。用户可通过虚拟机或双系统安装在Mac上运行Ubuntu ARM,抢先体验版已开放下载:[链接](https://www.baihezi.com/ubuntu/arm/desktop)。此版本不仅扩展了Ubuntu的硬件兼容性,还提供了丰富的功能和流畅的操作体验,适合开发者和技术爱好者尝试。
4935 9
|
Ubuntu Linux 网络安全
linux系统ubuntu中在命令行中打开图形界面的文件夹
在Ubuntu系统中,通过命令行打开图形界面的文件夹是一个高效且实用的操作。无论是使用Nautilus、Dolphin还是Thunar,都可以根据具体桌面环境选择合适的文件管理器。通过上述命令和方法,可以简化日常工作,提高效率。同时,解决权限问题和图形界面问题也能确保操作的顺利进行。掌握这些技巧,可以使Linux操作更加便捷和灵活。
669 3