上一篇博文介紹了交叉編譯opensll-1.0.2l,是否編譯成功,可以在目標環境中進行測試,這裏給編寫的一個簡單的測試程序,即利用openssl的rand功能生成隨機數。
本次測試的目標環境和編譯環境如下:
目標環境:CPU爲64位ARMv8的Samsung S6手機;
編譯環境:Ubuntu14.04 LTS + aarch64-linux-gnu-gcc 4.8編譯器。
測試步驟如下:
- 假設通過上一篇博文中的方法,將openssl的相關文件install在瞭如下路徑:/home/xiaot/armlib/openssl/則編寫測試程序代碼如下:
#include <stdio.h> #include <string.h> #include <openssl/rand.h> int main(int argc, char* argv[]) { int num = 10; int res = 0; int i = 0; unsigned char buf[10]; printf("RNG for default rand seed!\n\n"); res = RAND_bytes( buf, num ); if( res == 1 ) { printf("Succeed to generate rand numbers by RAND_bytes:\n"); for( i = 0; i < num; i++ ) printf("%0x ", buf[i]); printf("\n"); } else printf("Fail to generate rand numbers!\n"); res = RAND_bytes( buf, num ); if( res == 1 ) { printf("Succeed to generate rand numbers by RAND_bytes:\n"); for( i = 0; i < num; i++ ) printf("%0x ", buf[i]); printf("\n\n"); } else printf("Fail to generate rand numbers!\n"); res = RAND_pseudo_bytes( buf, num ); if( res == 1 ) { printf("Succeed to generate rand numbers by RAND_pseudo_bytes:\n"); for( i = 0; i < num; i++ ) printf("%0x ", buf[i]); printf("\n"); } else printf("Fail to generate rand numbers!\n"); res = RAND_pseudo_bytes( buf, num ); if( res == 1 ) { printf("Succeed to generate rand numbers by RAND_pseudo_bytes:\n"); for( i = 0; i < num; i++ ) printf("%0x ", buf[i]); printf("\n\n"); } else printf("Fail to generate rand numbers!\n"); return 0; }
- 編寫Makefile文件,如下:
需要注意的一點是S6環境不是一個標準的Linux環境,許多庫不存在,因此這裏需要加上-static的編譯選項,保證編譯出的可執行程序可以自包含。#source file #源文件,自動找所有.c和.cpp文件,並將目標定義爲同名.o文件 SOURCE := $(wildcard *.c) $(wildcard *.cpp) OBJS := $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCE))) TARGET := rng_SSL CC := aarch64-linux-gnu-gcc LIBS := -lssl -lcrypto -ldl -static LDFLAGS := -L /home/xiaot/armlib/openssl/lib/ DEFINES := INCLUDE := -I /home/xiaot/armlib/openssl/include/ CFLAGS := -g -Wall -std=c99 -O0 $(DEFINES) $(INCLUDE) CXXFLAGS:= $(CFLAGS) -DHAVE_CONFIG_H .PHONY : everything objs clean veryclean rebuild everything : $(TARGET) all : $(TARGET) objs : $(OBJS) rebuild: veryclean everything clean : rm -fr *.so rm -fr *.o rm -fr $(TARGET) veryclean : clean rm -fr $(TARGET) $(TARGET) : $(OBJS) $(CC) $(CXXFLAGS) -o $@ $(OBJS) $(LDFLAGS) $(LIBS)
- 進行make操作,生成對應的可執行文件如下圖:
- 將S6連接主機,在Ubuntu中通過adb連接S6(此步驟不再詳述),將可執行文件複製到S6的sdcard中,如下圖:
再將文件拷貝至S6本機下目錄(S6具有限制,只能在本機下目錄纔可以執行文件),將可執行文件提權使其能夠被執行。 - 通過運行./rng_SSL執行程序,成功執行的輸出結果如下圖:
至此完成了對openssl-1.0.2l的交叉編譯測試,該測試程序可以通用於ARMv8的開發板及設備,如果開發板上的Linux系統完整,且包含openssl庫,則Makefile文件中的編譯選項不需要添加-static選項。