openssl动态库生成以及交叉编译

来源:互联网 发布:宠物商城源码 编辑:程序博客网 时间:2024/06/07 14:26

虚拟机环境

ubuntu12.04

开发板

EasyARM-i.MX280A:   64m  sdram  128M  nandflash   运行官方提供的Linux-2.6.35.3内核linux


首先说一下如何在主机上进行编译,并生成动态库

在https://www.openssl.org/source/下载最新版的openssl,我下载的是 openssl-1.1.0c.tar.gz版本

拷贝到虚拟机中,找地方解压,

然后是经典三部曲,首先使用 ./config   make   make install

首先使用指令./config shared --prefix=/home/linux/opt/openssl --openssldir=/home/linux/opt/openssl/ssl

prefix 是安装目录,openssldir 是配置文件目录,shared 作用是生成动态连接库。

然后就是make

make install

全部完成之后在安装目录下会有lib文件夹,里面有我们需要的动态库和静态库文件

libcrypto.a  libcrypto.so  libcrypto.so.1.1  libssl.a  libssl.so  libssl.so.1.1 

然后我们跳转到/home/linux/opt/openssl/lib目录下,将动态库拷贝到系统库目录中/lib中

sudo cp -a libcrypto.so* libssl.so* /lib

大功告成,我们写点程序测试一下,我们写一个使用rc4加解密的程序测试一下

cryptotest.h

#ifndef _CRYPTOTEST_H_#define _CRYPTOTEST_H_typedef enum {GENERAL = 0,ECB,CBC,CFB,OFB,TRIPLE_ECB,TRIPLE_CBC}CRYPTO_MODE;//string DES_Encrypt(const string cleartext, const string key, CRYPTO_MODE mode);//string DES_Decrypt(const string ciphertext, const string key, CRYPTO_MODE mode);char * RC4_Encrypt(const char *cleartext, const char * key, int cleartextlen, int keylen);char * RC4_Decrypt(const char * ciphertext, const char * key, int cleartextlen, int keylen);#endif //_CRYPTOTEST_H_
openssltest.c
#include "cryptotest.h"#include <string.h>#include <stdio.h>int main(){char cleartext[] = "中国北京12345$abcde%ABCDE@!!!";char *ciphertext;char key[] = "beijingchina1234567890ABCDEFGH!!!";ciphertext = RC4_Encrypt(cleartext, key, strlen(cleartext), strlen(key));char * decrypt = RC4_Decrypt(ciphertext, key, strlen(cleartext), strlen(key));printf("cleartext:%s\n", cleartext);printf("genarate ciphertext:%s\n", ciphertext);printf("src ciphertext:%s\n", ciphertext);printf("genarate ciphertext:%s\n", decrypt);if (strcmp(cleartext, decrypt) == 0)printf("RC4 crypto ok!!!\n");elseprintf("RC4 crypto error!!!\n");return 0;}
rc4test.c
#include <stdlib.h>#include <openssl/rc4.h>#include <string.h>#include "cryptotest.h"char * RC4_Encrypt(const char *cleartext, const char * key, int cleartextlen, int keylen){RC4_KEY rc4key;char* tmp = malloc(cleartextlen + 1);memset(tmp, 0, cleartextlen + 1);RC4_set_key(&rc4key, keylen, (const unsigned char*)key);RC4(&rc4key, cleartextlen, (const unsigned char*)cleartext, tmp);return tmp;}char * RC4_Decrypt(const char * ciphertext, const char * key, int cleartextlen, int keylen){RC4_KEY rc4key;unsigned char* tmp = malloc(cleartextlen + 1);memset(tmp, 0, cleartextlen + 1);RC4_set_key(&rc4key, keylen, (const unsigned char*)key);RC4(&rc4key, cleartextlen, (const unsigned char*)ciphertext, tmp);return tmp;}
makefile

####################################################################### file        : test makefile for build current dir .c   #### author      : jernymy                                  #### date-time   : 05/06/2010                               #######################################################################CC      = gccCPP     = g++RM      = rm -rf## debug flagDBG_ENABLE   = 0## source file pathSRC_PATH   := .## target exec file nameTARGET     := openssltest## get all source filesSRCS         += $(wildcard $(SRC_PATH)/*.c)## all .o based on all .cOBJS        := $(SRCS:.c=.o)## need libs, add at hereLIBS := ssl crypto## used headers  file pathINCLUDE_PATH := /home/linux/opt/openssl/include/## used include librarys file pathLIBRARY_PATH := /home/linux/opt/openssl/lib/## debug for debug info, when use gdb to debugifeq (1, ${DBG_ENABLE}) CFLAGS += -D_DEBUG -O0 -g -DDEBUG=1endif## get all include pathCFLAGS  += $(foreach dir, $(INCLUDE_PATH), -I$(dir))## get all library pathLDFLAGS += $(foreach lib, $(LIBRARY_PATH), -L$(lib))## get all librarysLDFLAGS += $(foreach lib, $(LIBS), -l$(lib))all: clean buildbuild:$(CC) -c $(CFLAGS) $(SRCS)$(CC) $(CFLAGS) -o $(TARGET) $(OBJS) $(LDFLAGS)$(RM) $(OBJS)clean:$(RM) $(OBJS) $(TARGET)
准备好这几个文件,然后就可以make了,会生成openssltest可执行文件,我们执行以下这个文件会有输出

linux@ubuntu:~/work/opensslDemo/rc4test$ ./openssltestcleartext:中国北京12345$abcde%ABCDE@!!!genarate ciphertext:Zu�)�0Xv�ݏ����src ciphertext:Zu�)�0Xv�ݏ����genarate ciphertext:中国北京12345$abcde%ABCDE@!!!RC4 crypto ok!!!


下面我们要准备开始交叉编译

在openssl解压目录下,使用config命令

CC=arm-linux-gcc ./config no-asm shared --prefix=/home/linux/arm/openssl --openssldir=/home/linux/arm/openssl/ssl

生成了Makefile

然后就是make和make install

之后会在安装目录下生成lib文件

跳转到lib目录下linux@ubuntu:~$ cd arm/openssl/lib/
复制动态库文件到开发板中,因为我是用的nfs文件系统,所以复制到了nfs文件系统下

linux@ubuntu:~/arm/openssl/lib$ cp -a libcrypto.so* libssl.so* /nfsroot/rootfs/lib/

然后修改刚刚的代码中的Makefile文件

####################################################################### file        : test makefile for build current dir .c   #### author      : jernymy                                  #### date-time   : 05/06/2010                               #######################################################################CC      = arm-linux-gccCPP     = g++RM      = rm -rf## debug flagDBG_ENABLE   = 0## source file pathSRC_PATH   := .## target exec file nameTARGET     := openssltest-arm## get all source filesSRCS         += $(wildcard $(SRC_PATH)/*.c)## all .o based on all .cOBJS        := $(SRCS:.c=.o)## need libs, add at hereLIBS := ssl crypto## used headers  file pathINCLUDE_PATH := /home/linux/arm/openssl/include/## used include librarys file pathLIBRARY_PATH := /home/linux/arm/openssl/lib/## debug for debug info, when use gdb to debugifeq (1, ${DBG_ENABLE}) CFLAGS += -D_DEBUG -O0 -g -DDEBUG=1endif## get all include pathCFLAGS  += $(foreach dir, $(INCLUDE_PATH), -I$(dir))## get all library pathLDFLAGS += $(foreach lib, $(LIBRARY_PATH), -L$(lib))## get all librarysLDFLAGS += $(foreach lib, $(LIBS), -l$(lib))all: clean buildbuild:$(CC) -c $(CFLAGS) $(SRCS)$(CC) $(CFLAGS) -o $(TARGET) $(OBJS) $(LDFLAGS)$(RM) $(OBJS)clean:$(RM) $(OBJS) $(TARGET)
这样用make编译出来的文件就是针对开发板的可执行文件openssltest-arm

将可执行文件拷贝到开发板中

linux@ubuntu:~/work/opensslDemo/rc4test$ cp openssltest-arm /nfsroot/rootfs/root/
在开发板中执行openssltest-arm文件,效果和在电脑上的效果一样

root@EasyARM-iMX28x ~# ./openssltest-arm cleartext:涓浗鍖椾含12345$abcde%ABCDE@锛侊紒锛genarate ciphertext:ZuXv幂徛栝src ciphertext:ZuXv幂徛栝genarate ciphertext:涓浗鍖椾含12345$abcde%ABCDE@锛侊紒锛RC4 crypto ok!!!
开发板的速度较慢,所以执行比电脑慢许多,下面我们来使用静态库编译一下,看一下效果会不会好一些。

其实我们在编译openssl的时候动态库和静态库已经同时被编译出来了,都存放在安转目录下的lib中。

linux@ubuntu:~/arm/openssl/lib$ lsengines-1.1  libcrypto1.so  libcrypto.a  libcrypto.so.1.1  libssl1.so  libssl.a  libssl.so.1.1  pkgconfig
其中.a结尾的文件就是动态库。其实想要使用静态库编译很简单。

在应用程序需要连接外部库的情况下,Linux默认对库的连接是使用动态库,在找不到动态库的情况下再选择静态库。
所以只要将lib文件夹中的.so文件删除,系统在编译的时候就会使用静态库编译。

仍然是make,然后拷贝到开发板中,运行,运行速度确实快了许多,说明静态库真的比动态库效率高许多。


0 0