一、介绍
现如今IOT设备安全研究需要面对不同设备不同架构的产品,鉴于不同架构的编译也是从业者所需要掌握的技能。现如今主流设备架构主要以x86_64、arm、mips架构为主,不同架构不同指令集的编译以及错误处理如何解决,也是本篇文章所探讨的话题。
1.1 工具
Buildroot 是一个简单、高效、易用的工具,通过交叉编译生成嵌入式 Linux 系统。
下载地址: https://buildroot.org/download.html
1.2 界面
配置交叉编译工具设置(makemenuconfig),如图1-1 配置界面
TargetOptions 设备架构(如图1-2 设备架构)
Build Options 编译选项(如图1-3 编译选项)
主要在libraries设置居多(both static and shared),静态编译及动态编译
Toolchain 编译工具链(如图1-4 编译工具链)
主要gcc版本、内核版本、宽字符及C++配置选项设置
System configuration 系统配置(如图1-5 系统配置)
Linux Kernel 内核配置(如图1-6 内核配置)
Target Packages 程序依赖库(如图1-7 程序依赖库)
Leagcy config Options Leagcy 配置
1.3 编译
不能使用make-jN,因为Buildroot不支持top-levelparallel make , 反之 , 使用BR2_JLEVEL选项来告诉Buildroot运行编译每一个package使用make -JN。
编译完成后,生成的交叉编译工具链主要存于output/host/bin目录中(如图1-8 交叉编译工具链)
二. 交叉编译实测
实际工作中主要以编译静态程序为主(本次例子以MIPS为主,ARM同理)
2.1 Hello World
2.2 NetCat
下载地址: https://github.com/mirror/busybox.git
!!!注意所有的编译信息都存在于Makefile文件
工具支持CROSS_COMPILE不需要单独对编译选项进行修改
Makefile(如图2-2 Makefile文件)
查看编译文件(如图2-4 Busybox_MIPS)
2.3 巧获编译信息
部分产品由于编译过程依赖库较多so文件就会导致无法获知哪些依赖库,这边可通过打印详细gcc编译信息,获取make构建中传递给gcc编译器参数。
func CheckExists(path string) bool {
fmt.Println(“print gcc args:”, cmds)
file, err = os.OpenFile(name, os.O_APPEND|os.O_WRONLY, os.ModePerm)
file, err = os.Create(name)
file.WriteString(strings.Join(cmds, ” “))
cmd := exec.Command(“gcc”, cmds[1:]…)
cmd.Stdout = os.Stdout //正常输出
cmd.Stderr = os.Stderr //异常输出
#将程序命令为gcc,替换当前的gcc,达到劫持编译信息的目的
|
三. 总结
交叉编译所涉及的知识点较多,本片文章仅起到入门作用,让大家对交叉编译这个概念有初步的认识。
原文始发于微信公众号(山石网科安全技术研究院):基于Buildroot的嵌入式系统交叉编译技巧