如何交叉编译openssl、openssl 移植到ARM、IOT设备上

作者:zengzhi
1、思路:进行交叉编译openssh,需要事先交叉编译好zlib-1.2.11、openssl-1.0.2q,再进行交叉编译openssh。前面两者提供必需的库

2、软件下载:
zlib-1.2.11:http://www.zlib.net/
openssl-1.0.2q:http://distfiles.macports.org/openssl/
openssh-8.2p1:https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-8.2p1.tar.gz

3、工具链
由于需要移植到IOT设备上,在Ubuntu16上,
交叉编译工具链为:lede-sdk-17.01.2-imx6_gcc-5.4.0_musl-1.1.16_eabi.Linux-x86_64.tar

编译路径指向:lede-sdk-17.01.2-imx6_gcc-5.4.0_musl-1.1.16_eabi.Linux- x86_64/staging_dir/toolchain-arm_cortex-a9+neon_gcc-5.4.0_musl-1.1.16_eabi 。

在这个目录下的/bin 文件夹中的arm-openwrt-linux-gcc、arm-openwrt-linux-ar 为编译工具链

工具链使用示例:
用户可以使用示例程序 perf-test.rar
代码例程解压,进入 perf_test。
修改 perf_test/build.sh 中相应的工具链位置,如下高亮所示
#!/bin/sh
export STAGING_DIR=/home/zkty/lede-sdk-17.01.2-imx6_gcc-5.4.0_musl- 1.1.16_eabi.Linux-x86_64/staging_dir/toolchain-arm_cortex-a9+neon_gcc- 5.4.0_musl-1.1.16_eabi
export PATH= P A T H : PATH: PATH:STAGING_DIR/bin
make clean
make
运行 sh build.sh 即可编译完成。传入目标板,可执行。

4、编译过程
4.1 创建目录

cd /mnt/hgfs/myshare  	# 切换到用户目录
mkdir ssh				# 新建 ssh 工作目录,存放安装包
mkdir zlib.install		# 新建 zlib 安装目录,移植过程 zlib 镜像会安装到该目录
mkdir openssl.install	# 新建 openssl 安装目录,移植过程 openssl 镜像会安装到该目录
export STAGING_DIR=/home/zkty/lede-sdk-17.01.2-imx6_gcc-5.4.0_musl- 1.1.16_eabi.Linux-x86_64/staging_dir/toolchain-arm_cortex-a9+neon_gcc- 5.4.0_musl-1.1.16_eabi
export PATH=$PATH:$STAGING_DIR/bin #部署交叉工具链的路径

将 zlib-1.2.11.tar.gz、openssl-1.0.2q.tar.gz、openssh-8.2p1.tar.gz 三个源码包复制到ssh目录下,并解压

tar zxvf zlib-1.2.11.tar.gz
tar zxvf openssl-1.0.2q.tar.gz
tar zxvf openssh-8.2p1.tar.gz

4.2、 交叉编译zlib-1.2.11:

cd  zlib-1.2.11
prefix=/mnt/hgfs/myshare/zlib.install CC=arm-openwrt-linux-gcc ./configure
vim Makefile

将makefile中的选项修改如下:

CC=arm-openwrt-linux-gcc
LDSHARED=arm-openwrt-linux-gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map
CPP=arm-openwrt-linux-gcc -E
AR=arm-openwrt-linux-ar

然后执行make 、make install 即可。去到zlib.install中看,编译成功会生成文件:
如何交叉编译openssl、openssl 移植到ARM、IOT设备上_第1张图片

4.3、交叉编译OpenSSL(易错点)
一开始使用的版本比较高,一直编译不通过,可能是工具链不支持,换成低版本的OpenSSL之后就解决了,之前网上查过一些类似的情况,均不适用。大家看自己的情况进行选择。

cd openssl-1.1.1g/
ls  
./Configure no-asm  --prefix=/mnt/hgfs/myshare/openssl.install --cross-compile-prefix=arm-openwrt-linux-gcc -fPIC #使用-fPIC 生成静态链接库,
#sed -i "s/ -m64//g" Makefile #若有提示需要去除不适用的部分,可以使用这个删除
make CC=arm-openwrt-linux-gcc AR=arm-openwrt-linux-ar
make install 

生成静态库或者动态库时,要添加 -fPIC ,这是创建库文件时所需要的,保证库文件编译后,在内存中的位置不是绝对位置,而是一个相对位置。
不使用此命令,编译出来的静态库,没有重定位能力,往往无法使用。
而在openssl-1下编译出来的libcrypto.a是一个静态库,因此出现无法使用的情况。-fPIC 全称是Position Independent Code,用于生成位置无关代码,代码无绝对跳转,都是相对跳转。

编译成功后,可以查看到如下生成情况:
在这里插入图片描述4、4 交叉编译openssh
进入到openssh 相关目录

cd openssh-8.2p1
./configure --host=arm-openwrt-linux --with-libs --with-zlib=/mnt/hgfs/myshare/zlib.install --with-ssl-dir=/mnt/hgfs/myshare/openssl.install --disable-etc-default-login CC=arm-openwrt-linux-gcc AR=arm-openwrt-linux-ar
make

查看目录,发现编译成功,且生成scp、sftp、ssh sshd、ssh-add、ssh-agent、ssh-keygen、ssh-keyscan文件。

下期写怎么植入目标板。

你可能感兴趣的:(linux,c语言,编译器,gcc/gdb编译调试)