openssl 客户端程序移植到arm平台 OK6410上运行

ARM 174浏览

     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