binutils和gcc之间有什么关系?

8

问题如题,Centos Linux中的gcc包是否包含binutils? 如果我安装了gcc rpm软件包,是否还需要安装binutils? 此外,在Centos中,gccg++是否都已默认安装?


你可以执行 binutils --version 检查一下吗? - Fiddling Bits
没有binutils,你将无法运行任何程序。 - rakib_
1
@rakib:不,你可以在没有binutils的情况下运行程序,但是你无法编译它们。 - Basile Starynkevitch
1
@BasileStarynkevitch,每当我们运行一个程序时,程序加载器会加载所需的共享库(.so文件),而该加载器程序是binutils的一部分,那么如何在没有binutils的情况下运行程序呢?这是我目前所知道的,我错了吗? - rakib_
2
但是动态加载器(/lib/ld-linux.so*)是由libc软件包提供的,而不是由binutils提供的;您可以删除binutils软件包,仍然能够使用您的Linux系统(例如浏览器或文本处理器)。 - Basile Starynkevitch
@BasileStarynkevitch 谢谢您的澄清。我从头开始构建Linux,那时我首先构建了binutils(如果我没记错的话),每当我们安装操作系统时,binutils都会首先安装,这就是我的困惑所在。此外,我认为动态加载器是binutils的一部分。 - rakib_
1个回答

9

gcc包可能包含编译器本身,例如文件/usr/bin/gcc和目录/usr/lib/gcc/x86_64-linux-gnu/4.8/(其中包含可执行文件cc1)。

/usr/bin/gcc程序启动cc1(或cc1plus等)来编译您的源代码*.c,还使用as将由cc1生成的汇编代码(由cc1生成)转换为对象文件*.o,最后使用ld进行链接。

使用gcc -v编译一次以了解发生了什么,它会显示真正执行的二进制文件。请注意,gcc只是一个驱动程序(启动其他可执行文件,如cc1asld等)。

asld程序由binutils提供-需要编译。

所以,binutils软件包是gcc软件包的必需依赖项(可能还包括libclibc-devel等许多其他依赖项,但如果您真的想要,可以使用其他libc,如MUSL libc;通常libc提供动态链接器,例如/lib/ld-linux.so*)。

学习如何使用rpm(在Centos上,或者在Ubuntu和Debian上使用dpkg)查询软件包之间的依赖关系。

对于开发,您可能需要其他软件包。Debian有build-essential虚拟包。可能CentOS有相应的软件包。您肯定还想使用一些库(并且您需要它们的开发软件包,例如在Debian上使用libcurl4-gnutls-dev来开发libcurl HTTP客户端库)。另请参见此答案(适用于Ubuntu和Debian,但您可以将其适应为CentOS)。

在2021年,你至少想要使用GCC 10,并且可以决定编写自己的GCC插件(检查C++代码中的一些编码规则;你还想通过编写来记录你的编码约定)。请注意五个规则


我不明白的是,像你这样的贡献者怎么可能只有1点声望? - user0193
@Basile Starynkevitch - gdb是否使用binutils?也就是说,如果我想在某个平台上使用gdb,我是否需要在同一平台上安装与binutils相关的程序(如arasnmld等)? - Guy Avraham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接