c - __libc_start_main 和 _start 是什么?

标签 c linux gcc gdb elf

在过去的几天里,我一直试图了解当我们执行一个 C 程序时幕后会发生什么。然而,即使在阅读了大量帖子后,我也找不到详细而准确的解释。有人可以帮我吗?

最佳答案

在编译和链接程序时,您通常会为特定用途找到这样的特殊名称。
通常,类似于 _start将是可执行文件的实际入口点,它将位于某个目标文件或库中(例如 crt0.o 用于 C 运行时启动代码) - 这通常会由链接器自动添加到您的可执行文件中,类似添加 C 运行时库的方式(a)。
用于启动程序的操作系统代码将类似于(显然是伪代码,并且错误检查比它应该有的要少得多):

def spawnProg(progName):
    id = newProcess()                       # make process address space
    loadProgram(pid = id, file = progName)  # load program into it
    newThread(pid, initialPc = '_start')    # make new thread to run it
即使您自己创建了一个 main当用 C 编码时,这并不是真正开始发生的地方。在主程序启动之前,还有很多事情需要完成。因此,C 启动代码的内容将类似于(最简单的):
_start:  ;; Weave magic here to set up C and libc.

         call __setup_for_c       ; set up C environment
         call __libc_start_main   ; set up standard library
         call _main               ; call your main
         call __libc_stop_main    ; tear down standard library
         call __teardown_for_c    ; tear down C environment
         jmp  __exit              ; return to OS
“魔法编织”是为 C 程序准备环境所需的一切。这可能包括以下内容:
  • 设置静态数据(这应该被初始化为零,所以它可能只是一块内存的分配,然后由启动代码清零 - 否则你需要存储一个该大小的块,已经归零,在可执行文件中);
  • 准备argcargv在堆栈上,甚至准备堆栈本身(有可能用于 C 的特定调用约定,并且很可能操作系统在调用 _start 时根本不需要设置堆栈,因为进程的需要不知道);
  • 设置特定于线程的数据结构(例如每个线程的随机数生成器或错误变量);
  • 以其他方式初始化 C 库;等等。

  • 只有在所有这些都完成后才可以调用您的 main功能。也有可能在您的 main 之后需要完成工作退出,例如:
  • 调用 atexit处理程序(您希望在退出时自动运行的东西,无论退出发生在哪里);
  • 从共享资源中分离(例如,如果操作系统在关闭进程时没有自动执行此操作,则为共享内存);和
  • 释放进程退出时未自动清理的任何其他资源,否则会挂起。

  • (a) 可以告诉许多链接器不要这样做,例如,如果您正在编写不使用标准 C 库的东西,或者如果您想提供自己的 _start低级工作的例行公事。

    关于c - __libc_start_main 和 _start 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62709030/

    相关文章:

    c++ - 错误 : wx/setup. h:CodeBlocks 上没有这样的文件或目录 wxWidgets

    c - 初始化窗口代码 Mac OS X

    c++ - Eclipse Linux 库存 "Hello World"- 应用程序无法运行

    c++ - 使用 gcc4.2 在 OsX 10.9 上编译 Qt5.2 项目?

    c++ - 是否有 C++11/14 替代 __attribute__((packed))

    c - 一个 nginx worker 进程是同时处理两个请求还是一个一个处理?

    c - fread 无法从 C 中的二进制文件中读取结构的字符串值

    linux - 在 mozjpeg 上安装 npm 时出错,权限被拒绝?

    php - WordPress 网站迁移后缺少仪表板

    c - 使文本段可写,ELF