C运行时库- CRT(C Runtime)

CRT(C Runtime)是指C运行时库,它为C和C++程序提供了一组初始化和终止程序的基本构建块。这些构建块确保在main()函数执行之前和之后进行适当的初始化和清理。

CRT的主要任务包括:

  1. 初始化静态数据:分配和初始化静态和全局变量。
  2. 调用全局构造函数:在C++中,全局或静态对象的构造函数需要在main()之前被调用。
  3. 设置堆:对于动态内存分配(如mallocnew)。
  4. 处理程序终止:当main()函数退出或调用exit()时,确保适当地调用全局和静态对象的析构函数(在C++中)。

通常,CRT文件被分为以下几类:

  1. crt1.o / Scrt1.o:

    • 它们都定义程序的真正入口点_start
    • _start负责设置执行环境,调用全局构造函数,启动main()函数,并在main()返回后进行清理。
    • 通常,crt1.o用于常规的可执行文件,而Scrt1.o用于支持位置无关的可执行文件(PIE)。
  2. crti.o:

    • 定义用于初始化和清理函数的“开始”部分的代码。
    • crtn.o协同工作,确保全局构造函数和析构函数按正确的顺序被调用。
  3. crtbegin.o / crtbeginS.ocrtend.o / crtendS.o:

    • 这些文件处理与C++相关的静态初始化和清理。
    • crtbegin文件包含构造函数列表的开始,而crtend文件包含结束。
    • crtbeginS.ocrtendS.o版本用于支持位置无关代码。
  4. crtn.o:

    • 这个文件与crti.o相对应,它包含了用于初始化和清理函数的“结束”部分的代码。
    • 当程序结束时,它负责调用全局对象的析构函数。

当编译和链接一个程序时,链接器将自动选择正确的CRT文件,以确保程序的生命周期管理正确。如果使用特定的编译和链接选项,如-fPIC-pie,链接器可能会选择不同的CRT文件,如Scrt1.o而不是crt1.o,以支持这些选项。

为了更好地理解这些文件是如何工作的,可以考虑它们为程序的生命周期提供了一个框架:从程序的开始,到 main 函数的执行,再到程序的结束,每个阶段都有相应的初始化和清理工作需要完成。这些 crt 文件就是为此目的而存在的。

你可能感兴趣的:(CSAPP,C,c语言)