目标文件处理工具

一个可执行目标文件,本身包含一条条二进制指令,所以其最基本的依赖是指令集体系结构Instruction Set Architecture, ISA),ISA 本身还受一些硬件标准的影响,如端序

调用外部操作,这个分为两个方面,操作系统和运行时的动态库,动态库的接口标准

一般用目标三元组(Target Triplet)来描述一个软件运行的目标平台

  • 处理器架构(ISA)
  • 操作系统(Operating System, OS)
  • 应用二进制接口(Application Binary Interface, ABI)标准:运行时库和操作系统提供的系统调用的接口标准

例如

  • arm-none-eabi
    • ISA:arm
    • OS:none,指没有操作系统的裸机
    • ABI:eabi,指嵌入式二进制接口
  • riscv64gc-unknown-none-elf
    • ISA:riscv64gc-unknown,其中 riscv 指的 RISC-V,gc 指 RISC-V 架构的 GC 扩展,unknown 指未知的 CPU 厂商
    • OS:none
    • ABI:elf,指没有任何系统调用的封装支持,但可以生成 ELF 格式的执行程序

交叉(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