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

    技术2025-05-25  20

         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.alibcrypto.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

     

     

     

    最新回复(0)