openssl 客户端程序如何移植到arm平台上运行?
在我的项目中拥有一个服务器程序file_server和一个客户端程序file_client,它们实现了通过安全套接字层传输文件的功能。原本两个程序都在pc上运行,现在要把客户端程序移植到arm平台上。
原来makefile中生成客户端程序的规则是这样的:
gcc file_client.c -o file_client -lssl -lpthread
如果想移植到arm平台是不是直接将 gcc 改为 arm-linux-gcc就可以了呢?回答是不行的,原因在于-lssl连接的库libssl.a或 libssl.so原本是在x86的环境下编译生成的,所以直接arm-linux-gcc file_client.c -o file_client -lssl -lpthread 会提示搜索到的库格式不对。
因此应该重新编译openssl,步骤如下:
1.config:
#config no-asm (忽略x86汇编部分)
2.改Makefile
1) CC= gcc 改成 CC = arm-linux-gcc;
2) 删除 CFLAG= 中的 “-march=pentium”;(如果有的话)
3) AR=ar $(ARFLAGS) r 改为 AR=arm-linux-ar $(ARFLAGS) r;
4) ARD=ar $(ARFLAGS) d 改为 ARD=arm-linux-ar $(ARFLAGS) d;
5)RANLIB= /usr/bin/ranlib 改为 RANLIB= arm-linux-ranlib;
3.编译
#make
编译完成后会产生libssl.a 和libcrypto.a 两个归档文件,将这两个文件copy到客户端代码目录下,直接和源文件进行编译:
arm-linux-gcc file_client.c -o file_client libcryto.a libssl.a -lpthread
这时会出现:error:openssl/ssl.h: No such file or directory的错误,这显然是因为我们的arm-linux-gcc编译器没有把x86环境下的/usr/include作为标准头文件搜索目录的缘故。(原来在pc机上装x86的openssl时,将openssl的头文件install到这个目录)
我们可以加上一个选项: -I/usr/include
这时按照:
arm-linux-gcc file_client.c -o file_client libcryto.a libssl.a -lpthread -I/usr/include
进行编译,又会冒出一大堆的:undefined refrence to ' ' 错误。符号未定义?可以头文件都包含进来了啊?仔细分析另一种可能的原因是库的使用,准确的说是库的编译顺序,libssl.a用到很多符号,而这些符号只在libcryto.a定义或申明 ,那么libcrypto.a 应该出现在libssl.a 的后面 。
arm-linux-gcc file_client.c -o file_client libssl.a libcryto.a -lpthread -I/usr/include
这时还会提示:undefined refrence to ' dlopen' ,再将 libdl.a(用于加载动态库方法的库)包含进去即可。
最终编译命令:
arm-linux-gcc file_client.c -o file_client libssl.a libcryto.a -lpthread -I/usr/include -ldl -static
将生成的可执行程序 file_client 拷贝到开发板,chmod 777 file_client 修改权限,在pc上运行服务器程序,在开发板上运行客户端程序即可,下面给出我的程序在OK6410上的运行效果图:
1.运行客户端程序:
2.使用cd home切换客户端目录:
3.下载服务器上的文件serv.cpp
4.下载完成
5.屏幕刷新后,可见客户端home目录下多出的文件serv.cpp