了解 gcc 缩写

Understanding the gcc abbreviations

我刚刚查看了下面列出的 gcc-arm-none-eabi 编译器二进制文件,但我真的不知道所有使用的缩写。我想知道哪个二进制文件是预处理器、链接器、编译器等等...

$ ls /opt/gcc-arm-none-eabi-5_4-2016q3/bin/
arm-none-eabi-addr2line
arm-none-eabi-ar
arm-none-eabi-as
arm-none-eabi-c++
arm-none-eabi-c++filt
arm-none-eabi-cpp
arm-none-eabi-elfedit
arm-none-eabi-g++
arm-none-eabi-gcc
arm-none-eabi-gcc-5.4.1
arm-none-eabi-gcc-ar
arm-none-eabi-gcc-nm
arm-none-eabi-gcc-ranlib
arm-none-eabi-gcov
arm-none-eabi-gcov-tool
arm-none-eabi-gdb
arm-none-eabi-gdb-py
arm-none-eabi-gprof
arm-none-eabi-ld
arm-none-eabi-ld.bfd
arm-none-eabi-nm
arm-none-eabi-objcopy
arm-none-eabi-objdump
arm-none-eabi-ranlib
arm-none-eabi-readelf
arm-none-eabi-size
arm-none-eabi-strings
arm-none-eabi-strip

我只能猜到:gcc是编译器? ld 是链接器? 所有这些二进制文件的确切目的是什么?

开头的'arm-none-eabi'是编译器的类型。这称为元组,并指定为配置 'prefix'。许多二进制文件可能是链接或调用另一个二进制文件 (gcc) 的短包装脚本。还有一些名称是为了以防万一您有同名的现有系统二进制文件或安装了多个 gcc。

您可以在程序名称上通过 运行 一个 man 命令找到此信息。简而言之,

  • addr2line - 将地址(十六进制)转换为代码行号。
  • ar - 静态库(或存档)工具。
  • as - 汇编程序
  • c++ - C++ front-end
  • c++filt - 将经过修饰的名称转换为带有原型的函数。
  • cpp - 仅预处理器。
  • elfedit - elf header 操纵。
  • g++ - 带有 gnu 扩展的 C++。
  • gcc - 标准二进制文件(给定的选项可以和包装器一样)。
  • gcc-5.4.1 - 安装了多个 GCC 的系统的全名。
  • gcc-ar - 在多个 'ar'.
  • 的情况下重命名
  • gcc-nm - 在多个 'nm'.
  • 的情况下重命名
  • gcc-ranlib - 在多个 'ranlib'.
  • 的情况下重命名
  • gcov - 代码覆盖率
  • gcov-tool - 代码覆盖率
  • gdb - 调试器
  • gdb-py - 更精简的调试器
  • gprof - 调用 graph/profiler.
  • ld - 链接器(很可能是 gold)。
  • ld.bfd - 具有更多功能的老式链接器;对于大型 C++ 项目来说要慢得多。
  • nm - 以二进制显示 'names'。
  • objcopy - 操作二进制文件(节)。
  • objdump - 关于二进制文件的信息。
  • ranlib - 生成库索引。
  • readelf - 关于 ELF 二进制文件的信息。
  • 大小 - 程序部分大小
  • strings - 转储二进制文件中的所有字符串。
  • strip - 从二进制文件中删除调试信息。

作为一个概念,名称 'gcc-ar' 和 'ar' 在物理上是相同的。但是,路径中可能存在另一个 'ar'(Solaris 或其他 Unix 系统),'gcc-ar' 名称可用于获取特定于 gcc 的 'ar';所有 'gcc-XXX' 的东西都是针对这个用例的。