我正在处理关于链接的文本,并希望在所述文本中使用一些示例。
为了更好地了解当我调用gcc
驱动程序时发生的事情,我正在考虑手工编写所有编译旧学校;
cpp
cc1
as
ld
不幸的是,在我的Mac上,我似乎无法直接引用cc1
(cc1
中没有man
列表。我有什么选择?
答案 0 :(得分:4)
阅读有关GCC内部的一些材料。首先是GCC上的wikipage。然后,您可以使用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
会告诉您 cc1
使用了哪个gcc
。有关详情,请参阅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本书。
答案 1 :(得分:0)
作为参考,我在我的 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
所在的位置。