
交叉编译是什么一般我们的编译是本地编译例如我们在本地编译一个c程序后生成一个可执行文件而这个文件可以在我们本地执行那么我们说这个编译器运行的平台和程序运行的平台相同。而交叉编译就好理解了他是指在一个平台上编译但是程序要运行于另外一个平台。那么为什么需要这个平台呢很简单当我们要运行的平台他的硬件设施能力有限的时候就需要借助别的硬件设施更好的平台把除了运行之外的操作干完所以就需要在别的平台编译最终在目标平台运行这种一般用于嵌入式的设备。交叉编译和本地编译流程上的不同源代码 → 预处理 → 编译 → 汇编 → 链接 → 可执行文件步骤上和本地编译一样但是在预处理过程中需要连接目标平台的头文件在链接过程中需要链接的是目标平台的库在编译和汇编的时候要生成的目标平台的汇编语言和目标文件。总之一切和目标平台挂钩只是把当前编译平台当作了一个工具。编译工具链包含那些组件工具全称/别名作用使用场景ar.exeArchive创建、修改、提取静态库.a 文件打包多个 .o 文件成静态库as.exeAssembler汇编器将汇编代码.s转换为目标文件.o编译汇编语言文件ld.bfd.exeLinker (BFD版)GNU 链接器的一个变体使用 BFD 库链接目标文件成可执行文件ld.exeLinker标准 GNU 链接器合并目标文件和库生成最终的可执行文件ELF/EXEnm.exeName List列出目标文件中的符号表函数名、变量名查看库或可执行文件导出了哪些符号objcopy.exeObject Copy复制和转换目标文件格式ELF → bin/hex或去除调试信息objdump.exeObject Dump显示目标文件详细信息反汇编、查看段信息、查看符号表ranlib.exeRandom Archive为静态库.a生成索引加快链接速度ar 打包后运行相当于ar -sreadelf.exeRead ELF显示 ELF 格式文件的信息查看可执行文件头、段、节等信息strip.exeStrip去除目标文件中的符号表和调试信息减小可执行文件体积在流程中的使用源代码 (.c/.cpp) ↓ [编译器 gcc/clang] ← 这个工具不在你的列表中是另一个组件 ↓ 汇编代码 (.s) ↓ [as.exe] ← 汇编器 ↓ 目标文件 (.o) ↓ [ar.exe] [ranlib.exe] ← 可选打包成静态库 (.a) ↓ [ld.exe] 或 [ld.bfd.exe] ← 链接器 ↓ 可执行文件 (ELF/EXE) ↓ [objcopy.exe] ← 格式转换如生成 .bin [strip.exe] ← 去除符号优化体积 [objdump.exe] ← 反汇编查看 [nm.exe] ← 查看符号 [readelf.exe] ← 查看 ELF 结构