Linux实现树莓派3B的国密SM9算法交叉编译——(一)环境部署、简单测试与eclipse工程项目测试
这篇文章主要介绍了交叉编译的实现,包括环境部署,并简单测试交叉编译环境是否安装成功。
一、交叉编译
在一个平台上生成另一个平台上的可执行代码。为什么要大费周折的进行交叉编译呢?一句话:不得已而为之。有时是因为目的平台上不允许或不能够安装所需要的编译器,而又需要这个编译器的某些特征;有时是因为目的平台上的资源贫乏,无法运行所需要的编译器;有时又是因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。
要进行交叉编译,我们需要在主机平台上安装对应的交叉编译工具链(cross compilation tool chain),然后用这个交叉编译工具链编译源代码,最终生成可在目标平台上运行的代码。
常见的交叉编译例子如下:
1、在Windows PC上,利用ADS(ARM 开发环境),使用armcc编译器,则可编译出针对ARM CPU的可执行代码。
2、在Linux PC上,利用arm-linux-gcc编译器,可编译出针对Linux ARM平台的可执行代码。
3、在Windows PC上,利用cygwin环境,运行arm-elf-gcc编译器,可编译出针对ARM CPU的可执行代码。
二、交叉编译源代码
1、环境
Kali-Linux(由于本机Ubuntu 16.04虚拟机坏了,所以使用Kali-Linux进行部署由于测试)
2、树莓派交叉编译工具安装
step1. 下载树莓派交叉编译工具https://github.com/raspberrypi/tools
step2. 将源码放到各用户都能share的文件夹下,如/usr/tools

在该文件夹下,一共有5个不同版本的交叉编译工具
arm-bcm2708hardfp-linux-gnueabi
gcc-linaro-arm-linux-gnueabihf-raspbian
arm-bcm2708-linux-gnueabi
gcc-linaro-arm-linux-gnueabihf-raspbian-x64
arm-rpi-4.9.-linux-gnueabihf
其中arm-rpi-4.9.3-linux-gnueabihf和gcc-linaro-arm-linux-gnueabihf-raspbian-x64是64位机器用的,每一个交叉编译工具的目录下都有bin目录进入,执行./arm-linux-gnueabihf-gcc -v可查看gcc版本。
在这里我们使用的是 gcc-linaro-arm-linux-gnueabihf-raspbian-x64 版本!
step3. 将交叉编译工具的路径加到环境变量中,为了以后启动不用再设置,我加到了/etc/bash.bashrc中
gedit /etc/bash.bashrc
或者
#/etc/profile全局的,随系统启动设置【设置这个文件是一劳永逸的办法】
#gedit /etc/profile
64位添加:
#树莓派交叉编译环境:start
export PATH=$PATH:/usr/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
export PATH=$PATH:/usr/tools/arm-bcm2708/arm-bcm2708-linux-gnueabi/bin
#树莓派交叉编译环境:start
32位添加:
#树莓派交叉编译环境:start
export PATH=$PATH:/usr/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin(gcc有问题,暂不明)
export PATH=$PATH:/usr/tools/arm-bcm2708/arm-bcm2708-linux-gnueabi/bin(使用这个文件中的gcc)
#树莓派交叉编译环境:start
重新加载
source /etc/bash.bashrc
step4. 检测是否安装成功
way1:
arm #双tab
显示以下内容

way2:
arm-linux-gnueabihf-gcc -v
#能显示正确信息 arm-linux-gnueabihf-g++ -v
#能显示正确信息
三、编译源代码
1、在写编译脚本时,一定要确保编译器写的是交叉编译的编译器。比如比较常用的Makefile,
demo: $(obj)
$(CXX) -o $@ $^ $(LDFLAGS)
其中的CXX必须是arm-linux-gnueabihf-g++才能编译出正确的在树莓派上的可执行文件。
2、编译第三方库
如果你想设置全局的CC和CXX变量,在每次打开一个新的Terminal时,输入以下命令:
export CC=arm-linux-gnueabihf-gcc
export CXX=arm-linux-gnueabihf-g++
其他的全局变量同上。
四、简单例子测试
编写一个测试文件,在PC机上完成编译然后上传到树莓派中并执行。该例子仅测试交叉编译是否成功并简单测试了浮点数功能
新建一个文件夹hello,里面有两个文件hello.c 和 Makefile。
hello.c
#include <stdio.h>
int main(void)
{
float pi = 3.14;
printf("Hello World\n");
printf("%.2f\n",*pi);
}
Makefile
CC=arm-linux-gnueabihf-gcc
hello:hello.o
clean:
rm -rf hello.o hello
在makefile文件中使用了至少两条隐含规则,CC为默认工具链;.o文件由同名的.c文件生成。
在该文件夹下,进行make一下
make
把产生的可执行文件hello上传到树莓派,执行hello可执行文件,可以得到正确结果,说明交叉编译链配置成功
ls
chmod hello #赋予可执行权限
./hello

五、eclipse交叉编译环境测试
1、创建交叉应用工程
在 Eclipse 主界面点击菜单 File > New > C/C++ Project > C Managed Build或者C++ Managed Build,在弹出的“C/C++ Project”对话框中,输入项目名称。选择一个项目类型(如Executable/Empty Project),在 Toolchains 中一定要选 Cross GCC,这是CDT对交叉环境的支持,提供了额外的功能,以方便嵌入式应用程序的开发。
点击下一步,来到“Select Configurations”页面,我们采用默认,直接下一步,来到“Cross GCC Command”的设置。这里我们可以填写交叉编译工具链的交缀和路径,如:
Cross compiler prefix: arm-linux-gnueabihf- #(别打错!)
Cross compiler path: /usr/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin

上例的情况是在我们已经安装好了ARM芯片商提供的交叉编译包。一般来说,芯片商都提供了这样一个交叉编译环境,包括目标平台的编译工具链、Glibc库、二进制工具和其它常用工具。上例是TI提供的DM3730的开发包的安装路径和程序的前缀(真实程序为:arm-arago-linux-gnueabi-gcc、arm-arago-linux-gnueabi-ld等)
最后点击完成,一个交叉项目就创建好了。关于交叉编译前缀和路径的设置,在项目创建后,可以在项目的属性中改变它。
2、设置工程属性(可选)
建好工程后,右击工程,选择properties,在左侧栏中选中C/C++ General →Path and Symbols,设置Include文件夹,注意为确保不漏,Assembly、GNU C以及GNU C++这三个都要设置这些路径哦:


选中左侧栏中的C/C++ Build→Settings,进行交叉编译器设置:

首先可以看到之前在建立工程时的前缀和编译工具链路径会在这里显示。前缀千万不要打错啊。
查看编译器工具的设置:

可以看到,在Command下方的All Options中出现了工具链的目录。在编译时,Eclipse就会调用 前缀 + 相应的工具 (如gcc) 去编译啦。下方的Compiler、Linker、Assembler的Command分别为g++、g++、as。
3、添加头文件及源文件
配置好以上内容后就可以添加个.c或者.cpp的源文件,以上面hello为例:

或者

4、编译
Project > Build Project
5、执行
将编译好的二进制文件拷贝到树莓派中执行
chmod pi_cross_c
chmod pi_cross_cpp
./chmod pi_cross_c
./chmod pi_cross_cpp

到此,Kali-Linux已经部署完成了对树莓派3B的交叉编译环境!!!
下一篇文章:
Linux实现树莓派3B的交叉编译——(二)miracl库的测试与静态库的生成
参考:https://blog.csdn.net/caomang23/article/details/82658982
https://blog.csdn.net/u010833052/article/details/78481973
https://blog.csdn.net/iefenghao/article/details/88815093
https://www.cnblogs.com/NJdonghao/p/Cross_Toolchain.html
https://blog.csdn.net/qq_16397695/article/details/83063826
https://shumeipai.nxez.com/2013/10/08/configure-cross-compiler-platform-raspberry-pi.html
Linux实现树莓派3B的国密SM9算法交叉编译——(一)环境部署、简单测试与eclipse工程项目测试的更多相关文章
- Linux实现树莓派3B的国密SM9算法交叉编译——(三)国密SM9算法实现
先参考这篇文章 Linux实现树莓派3B的国密SM9算法交叉编译——(二)miracl库的测试与静态库的生成 进行miracl库的交叉编译测试,并生成miracl静态链接库. 这篇文章主要介绍基于mi ...
- Linux实现树莓派3B的国密SM9算法交叉编译——(二)miracl库的测试与静态库的生成
先参考这篇文章 Linux实现树莓派3B的国密SM9算法交叉编译——(一)环境部署.简单测试与eclipse工程项目测试 部署好环境,并简单测试交叉编译环境是否安装成功,最后实现在Eclipse上进行 ...
- 国密SM9算法C++实现(Linux)
首先参考 Linux下编译并使用miracl密码库 该博文在linux下编译Miracl库. 编译完了,自然是要用的,下面介绍两种在C程序中使用miracl库的方法. 方法一: 1. 源码编译完后的必 ...
- 谈谈PBOC3.0中使用的国密SM2算法
转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/39780825 作者:小马 一 知识准备 SM2是国密局推出的一种他们自己说具有自主 ...
- Java国密相关算法(bouncycastle)
公用类算法: PCIKeyPair.java /** * @Author: dzy * @Date: 2018/9/27 14:18 * @Describe: 公私钥对 */ @Data @AllAr ...
- 国密SM3算法在linux和windows平台结果不一致问题
什么是sm3,是一种类似于sha256的哈希算法,是咱们国家的哈希标准算法: 最近在使用sm3算法时,同样的一份数据,调用同样的sm3接口,发现得到的结果是不一样的: 那么在应用过的过程中,如果同样的 ...
- 树莓派3b 换国内源 更新源
在国内要更新源的时候,因为是国外的源,总会出现网速太慢的问题, 以下是对于安装了,2017-11-29-raspbian-stretch 系统源 更换最好用root登陆操作 sudo passwd r ...
- java 解析国密SM2算法证书
首先说明用Java自带的解析x509证书类,是不能解析sm2算法的证书,执行会抛出异常. 用开源库bouncycastle能够解析.详细代码 private byte[] getCSPK(byte[] ...
- [Linux基础环境/软件]Linux下安装resin web服务器(涉及gcc、jdk环境部署)
由于Ubuntu自带是没有jdk和gcc编译器的,而安装resin需要C编译器和jdk的支持,而且resin本身是java写的.另外我本身的网站是zip打包的,所以linux也要安装了gcc.jdk. ...
随机推荐
- 环境配置 | 安装Jupyter Notebook及jupyter_contrib_nbextensions库实现代码自动补全
一.Jupyter Notebook的安装与启动 安装Jupyter Notebook pip3 install jupyter 启动 jupyter notebook 输入命令后会自动弹出浏览器窗口 ...
- springboot项目集成activity
1.按照上一篇博客,新建好springboot项目后,在项目pom.xml文件中添加activity依赖 <dependency> <groupId>org.activiti& ...
- 1080 Graduate Admission
大致题意就是有N个学生,有M个学校,每个学校的名额都是正整数.每个学生可以填K个学校志愿,N个学生一起排名以后,排名高的学生先挑学校,不保护一志愿. 题目要求: 首先,把所有学生按总成绩SUM(GE+ ...
- windows-problem :电脑上网的无线图标带有黄色星号,但不影响正常上网!
电脑可以上网,但是无线图标带有黄色星号如何解决? 进入“网络和共享中心”,点击“更改适配器设置”,看看是不是有两个以上的“本地连接”,只有一个有用,其他的删除即可.
- SCSS的基本操作
Sass是成熟.稳定.强大的CSS预处理器,而SCSS是Sass3版本当中引入的新语法特性,完全兼容CSS3的同时继承了Sass强大的动态功能. 特性概览 CSS书写代码规模较大的Web应用时,容易造 ...
- jsp中引用的jstl 和fmt标签-详解
JSTL 核心标签库标签共有13个,功能上分为4类: 1.表达式控制标签:out.set.remove.catch 2.流程控制标签:if.choose.when.otherwise 3.循环标签:f ...
- 并查集-D - 畅通工程
D - 畅通工程 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通 ...
- Ubuntu切换默认sh为bash或者dash
Ubuntu切换默认sh为bash或者dash 1 bash与dash 从Ubuntu 6.10开始,默认使用dash(theDebian Almquist Shell)而不是bash(the G ...
- [LOJ113] 最大异或和 - 线性基
虽然是SB模板但还真是第一次手工(然而居然又被运算符优先级调戏了) #include <bits/stdc++.h> using namespace std; #define int lo ...
- <<甄嬛传>>后感
2020年疫情和休假的时间里,刷了几部喜欢的电视剧,从<好先生>孙红雷和车晓的现代剧,到刷了至少6遍的<新三国>后,一直想了解司马懿和曹丕,接着就到了<大军师司马懿之军师 ...