使用ARM GCC编译openssl

1.下载arm-linux-gcc和openssl

arm-gcc下载地址推荐:
http://ftp.arm.linux.org.uk/pub/armlinux/toolchain
截止目前的版本是cross-3.2.tar.bz2
opensssl使用的是openssl-1.0.1j.tar.gz

(arm-gcc的版本很重要,我接触过两家在ARM平台上开发产品的公司,他们采购的CPU厂家都会提供对应的arm编译平台,不是随便下载的都能使用。本文主要是自己学习,所以以arm.linux.org.uk提供的为准)
2.挂载windows的共享目录,拷贝已经下载的arm-gcc和openssl
mount -t cifs -o username=user,password=pw //ip/folder /mnt
(smbfs已经废弃,改为cifs)
cp /mnt/cross-3.2.tar.bz2 ~/openssl4arm
cp /mnt/openssl-1.0.1j.tar.gz ~/openssl4arm

3.解压openssl和arm-gcc
tar zxvf openssl-1.0.1j.tar.gz
tar jxvf cross-<version>.tar.bz2

解压后的目录如下:
# ls -al
drwxr-xr-x 5 root root 4096 Jan 5 15:36 ./
drwx--x--- 16 root root 4096 Jan 5 17:10 ../
-rwxr-xr-x 1 root root 84593454 Jan 5 15:35 cross-3.2.tar.bz2*
drwxr-xr-x 3 root root 4096 Jan 5 16:48 openssl/
drwxr-xr-x 22 root root 4096 Jan 5 17:11 openssl-1.0.1j/
-rwxr-xr-x 1 root root 4432964 Jan 5 14:06 openssl-1.0.1j.tar.gz*
drwxr-xr-x 3 root root 4096 Jan 5 15:36 usr/

(usr是cross-3.2.tar.bz2解压后的目录)

4.复制arm-gcc到/usr/local下
cp -r usr/local/arm/ /usr/local/

(在刚开始的时候,没有将arm目录拷贝到/usr/local下面,make时总提示无法加载libc.so.6: ELF file OS ABI invalid,测试build一个helloworld.c的程序,也是同样的报错信息,可喜的是错误提示中显示了无法加载的libc.so.6路径为/usr/local/arm/lib/libc.so.6,所以照猫画虎,将整个arm目录放置到/usr/local下面,再次build就正常了)

5.建立arm-gcc各命令的软连接
cd /usr/local/arm/bin
ln -s arm-linux-ar arm-linux-gcc-ar
ln -s arm-linux-ld arm-linux-gcc-ld
ln -s arm-linux-as arm-linux-gcc-as

(这里建立软连接,是因为openssl的Makefile里使用如下的方式定义的,而所用的ARM-GCC没有安装这样的定义命名各程序,所以如果不建立软连接,make时会提示找不到命令:
CC=arm-linux-gcc
ar=${CC}-ar
)

6.创建openssl的安装目录
mkdir -p /root/openssl4arm/openssl/openssl

(此处目录根据自己的实际环境随意创建,没有特殊要求)

7.配置环境变量
#设置openssl的安装目录
export OPENSSLDIR=/root/openssl4arm/openssl/openssl
#下面是设置编译openssl的环境变量(此处配置来源于www)
export INSTALLDIR=/usr/local/arm/
export PATH=$INSTALLDIR/bin:$PATH
export TARGETMACH=arm-linux
export BUILDMACH=i686-pc-linux-gnu
export CROSS=arm-linux
export CC=${CROSS}-gcc
export LD=${CROSS}-ld
export AS=${CROSS}-as
export AR=${CROSS}-ar

(这里配置环境变量主要为了简化后续的工作,不用再费力书写那么长的路径和命令名,如果你专业做交叉编译,可以将这些内容添加到.bash_profile里面永久生效)

8.编译opensll
./Configure --openssldir=${OPENSSLDIR} no-asm no-zlib no-shared os/compiler:arm-linux-gcc
(如果提示找不到头文件或者库,可以尝试手动配置一下 -L${INSTALLDIR}/lib -I${INSTALLDIR}/include, 但是本地测试加上这两个选项反而会提示错误,所以无所谓了,就做个备忘)
make
make install

7.生成shared library

由于平台所限,默认openssl使用arm-gcc编译之后不会产生.so文件,即使指定shared参数,也会给出警告不能产生此平台的so文件,所以需要手动来生成(下面内容来自www,稍有修改)

cd $OPENSSLDIR/lib/
$AR -x libcrypto.a
CC -shared *.o -o libcrypto.so
rm *.o
$AR -x libssl.a
CC -shared *.o -o libssl.so
rm *.o

出错记录:

#error "<dirent.h> not supported"
究其根本原因是下载的gcc自带的drient.h没有定义DIR结构体和其他相关函数,所以一定要下载合适的编译器,或者咨询厂家有没有这一功能

后记:

从下载环境到编译成功,一共花了一天的时间,虽然编译安装是完成了,但是没有在实际的ARM平台上运行测试,也不知道openssl库能不能工作。但是就编译过程来说,如果编译器选择的合适,还是很顺畅的,基本上不会遇到太多的问题,但是如果想配置一些openssl的编译选项,还是得花点时间去了解openssl的INSTALL文档。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据