目标文件处理工具
一个可执行目标文件,本身包含一条条二进制指令,所以其最基本的依赖是指令集体系结构(Instruction Set Architecture, ISA),ISA 本身还受一些硬件标准的影响,如端序
调用外部操作,这个分为两个方面,操作系统和运行时的动态库,动态库的接口标准
一般用目标三元组(Target Triplet)来描述一个软件运行的目标平台
- 处理器架构(ISA)
- 操作系统(Operating System, OS)
- 应用二进制接口(Application Binary Interface, ABI)标准:运行时库和操作系统提供的系统调用的接口标准
例如
arm-none-eabi
:- ISA:
arm
- OS:
none
,指没有操作系统的裸机 - ABI:
eabi
,指嵌入式二进制接口
- ISA:
riscv64gc-unknown-none-elf
:- ISA:
riscv64gc-unknown
,其中 riscv 指的 RISC-V,gc 指 RISC-V 架构的 GC 扩展,unknown 指未知的 CPU 厂商 - OS:
none
- ABI:
elf
,指没有任何系统调用的封装支持,但可以生成 ELF 格式的执行程序
- ISA:
交叉(cross),有一类程序,他的作用就是处理其它程序,于是这里就存在两个平台,host 和 target,在主机(host)平台上编译能在目标(target)平台运行的程序,还有构建这类程序的平台 build
ISA
在 CPU 架构中,可能包含小端序(little-endian, el),大端序(big-endian, eb)
OS
none
linux
运行时库
嵌入式应用二进制接口(Embedded Application Binary Interface, EABI)
GNU libc 封装了 Linux 系统调用,并提供 POSIX 接口为主的函数库
硬件浮点(Hard Float, HF)表示使用硬件浮点单元 (FPU) 来进行浮点运算,而不是软件实现的浮点运算,从而提高性能
工具链
Binutils:Binutils 是 GNU 工具之一,它包括链接器、汇编器和其它一些工具,它是二进制代码的处理和维护工具,GMU Binutils
GCC
GLibc
GDB
QEMU
查看可执行文件的格式:file
查看可执行文件的内容:rust-readobj
查看可执行文件的指令:rust-objdump
修改可执行文件:rust-objcopy
获取工具链
想要获取交叉工具链,可以直接检索下载对应的工具链,也可以选择从工具的源码制作,这个步骤同样有一些工具
ARM:
RISC-V