Skip to content

Commit

Permalink
update:
Browse files Browse the repository at this point in the history
  • Loading branch information
HalfSweet committed Jan 1, 2025
1 parent 49b316f commit 2eb3e35
Showing 1 changed file with 25 additions and 0 deletions.
25 changes: 25 additions & 0 deletions src/posts/为什么我的电脑里有那么多GCC.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,3 +79,28 @@ IR的思想使得我们大大减低开发各个语言和各个平台所需编译
### 总结

经过这一个流程之后我们发现,和硬件平台相关的似乎只有后端部分,而前端和中端的部分其实是和硬件平台无关的。但是因为GCC的架构设计耦合性较高,因此实际很难将其分离。因此这也就导致了遇到平台差异较大的平台,我们只能修改后端部分之后打包成一个新的可执行文件,即使前端和中端部分的代码是一样的。

而所谓的厂商魔改的GCC,其实大概率也就是修改了一部分的后端代码,然后再进行重新编译而已。

## GCC编译器的命名规则

我们知道,对一个CLI程序来说,其实是无所谓其名称的,但是一般来说为了区分不同的交叉编译器,我们会在其名称中加入一些前缀。这些前缀的一般规则为`arch [-vendor] [-os] - eabi`,其含义为:

- `arch`:目标处理器的架构,例如`arm``riscv`
- `vendor`:供应商,例如`espressif`等,是可选项。
- `os`:目标操作系统,例如`linux`等,是可选项。
- `eabi`:目标的ABI,例如`eabi``gnueabi`等。

当然这样的规则是比较松散的约定俗成,理论上厂商可以完全不遵守。例如一些人喜欢把riscv32的编译器命名为`riscv32-unknown-elf-gcc`,而另一些人则喜欢把它命名为`riscv-none-elf-gcc`

## 如何选择合适的GCC

事实上,一个交叉编译器其实是可以为多种微小变体的架构编译的。例如常见的`arm-none-eabi-gcc`就可以编译`corrtex-m0``corrtex-m3``corrtex-m4`等,并且还可以选择是否存在`fpu`等特性。而这类相似的架构实际上可以通过编译时configure的`--target`参数来指定。GCC目前支持的target可以在这个网站上获取: <https://gcc.gnu.org/install/specific.html>

顺便多嘴一句,该编译器支持的架构的变体可以通过`-mcpu``-mfpu`参数来指定,如果你不清楚支持哪些,可以运行诸如`arm-none-eabi-gcc -mcpu=help`的命令来查询。

## 为什么编译器不能把所有的架构都支持

事实上这样想的人不少,但是GCC的架构确实积难重返。因此比较新一点的框架例如LLVM就将所有支持的后端都打包在了一起。它的工具例如`clang`在进行交叉编译的时候仅需要指定`-target`参数即可。

当然如果你喜欢的话,clang同样也可以只打包一个后端进去。

0 comments on commit 2eb3e35

Please sign in to comment.