Next: Header Dirs, Previous: Fragments, Up: Top
collect2
GCC使用叫做 collect2
的工具,在几乎所有的系统上,来安排在起始
时候调用不同的初始化函数。
程序 collect2
的工作方式是通过初次连接程序,并查找连接器输出
文件中的指示为构造函数的特定名字符号;如果找到,则会创建一个新的包含
这些符号的临时文件 ‘.c’,编译该文件,并再次连接程序。
实际调用构造者的是叫做 __main
的子程序,其在main函数体(假若
main
是由GNU CC编译的)的开始处被(自动的)调用。调用
__main
是必需的,即使当编译C代码,并允许将C和C++目标代码连接
一起时。如果使用了 -nostdlib,则会得到对 __main
未解
决的引用(unresolved reference)这样的错误,这是因为它是定义在标准GCC库
中。将 -lgcc 包含在编译器命令行的后面便可以解决这个引用。
程序 collect2
被作为 ld
安装在编译器过程所被安装的目录
下。当 collect2
需要找到 真正的 ld
时,它会尝试
下面的文件名:
PATH
所列出的目录下的 real-ld。
REAL_LD_FILE_NAME
则搜索该文件。
collect2
递归执行自己
的以外。
PATH
下的 ld。
“编译器搜索目录”是指的 gcc 针对编译器过程所搜寻的全部目录。 这包括通过 -B 制定的目录。
交叉编译器的搜寻方式有一些不同:
PATH
下的 target-real-ld。
REAL_LD_FILE_NAME
则搜索该文件。
PATH
下的 target-ld。
collect2
显示的避免使用调用 collect2
的文件名来运行
ld
。实际上,它记录了一个名字列表——以防一个 collect2
版本会
找到另一个版本的 collect2
。
collect2
使用上面针对 ld
的相同算法来搜寻工具 nm
和
strip
。