【发布时间】:2013-05-17 16:07:48
【问题描述】:
我正在处理有关链接的文本,并希望与所述文本中的一些示例一起工作。
为了更好地了解我调用 gcc 驱动程序时发生了什么,我正在考虑手动完成所有老式编译;
- 使用
cpp进行预处理 - 用
cc1编译 - 与
as组装 - 使用
ld链接
不幸的是,在我的 Mac 上,我似乎无法直接引用 cc1(man 中没有 cc1 的列表)。我有哪些选择?
【问题讨论】:
我正在处理有关链接的文本,并希望与所述文本中的一些示例一起工作。
为了更好地了解我调用 gcc 驱动程序时发生了什么,我正在考虑手动完成所有老式编译;
cpp进行预处理
cc1编译as组装ld链接
不幸的是,在我的 Mac 上,我似乎无法直接引用 cc1(man 中没有 cc1 的列表)。我有哪些选择?
【问题讨论】:
阅读一些关于 GCC 内部的材料。首先是GCC 上的维基页面。然后,您可以使用MELT probe(您可能希望Linux 系统使用它)。 然后阅读GCC manual。还有GCC resource center
使用gcc -v -Wall 编译,它会显示cc1 正在运行什么(-Wall 总是有用的)。所以尝试用gcc -v -Wall hello.c -o helloworld.bin编译
cc1 程序不要放在您的 PATH 或 /usr/bin/ 中,而是在我的系统上 - 在 /usr/lib/gcc/x86_64-linux-gnu/4.8/cc1 中
命令gcc -print-prog-name=cc1 将告诉您您的 gcc 使用了哪个cc1。请参阅GCC debugging options 了解更多信息。
预处理现在在 cc1 内部。
gcc 程序只是一个驱动程序,从 cc1(它完成大部分编译工作)开始,然后是 as、ld 等...
MELT site 包含一些文档,以及一些解释 GCC 的幻灯片,您可能会觉得它们很有趣。 MELT 是一种扩展 GCC 的领域特定语言。
另见http://starynkevitch.net/Basile/gcc-melt/cc1-internals.svg上的图片和下图
图片来自http://starynkevitch.net/Basile/gcc-melt/gcc-MELT-inside.png,由我完成,CC BY SA
cc1 正在生成一个.s 汇编文件; as(由gcc 开始)正在将其转换为.o。 ld 链接器(由gcc 启动)将生成库或可执行文件。
PS。我有一个 Linux 系统,但在 MacOSX 上情况非常相似。
一本关于链接的好书是Levine's Linkers & loaders book。
PS。 MELT 在 2021 年过时,但我正在研究 Bismon 静态源代码分析器和 RefPerSys(生成 C++ 代码)。
【讨论】:
作为参考,我在我的 macOS (Catalina) 上安装了带有 brew 的 gcc-10。
虽然cc1 不能直接访问(通过 PATH),但可以在
/usr/local/Cellar/gcc/10.2.0/libexec/gcc/x86_64-apple-darwin19/10.2.0
如果您迷路了,请尝试gcc -v,从详细信息中您可能会找到您的cc1 所在的位置。
【讨论】: