C 装载机的角色

C 装载机的角色,c,loader,C,Loader,在linux机器上加载进程时,加载程序的角色是什么。它是否只创建虚拟地址空间,或者还做了其他一些事情,如设置堆栈指针、将BSS段初始化为零等,或者C运行时库与此有关?它不创建地址空间;这是内核的工作。内核还设置了一个堆栈。加载程序将程序和库加载到地址空间,包括将零映射到BSS段等。大多数Linux系统/程序使用GNU C库glibc附带的加载程序。我希望BSS以及任何其他初始化的全局变量,作为加载到进程内存空间的可执行映像的一部分(因此这些变量永远不需要运行时初始化)。顺便说一下,只有一个堆栈指

在linux机器上加载进程时,加载程序的角色是什么。它是否只创建虚拟地址空间,或者还做了其他一些事情,如设置堆栈指针、将BSS段初始化为零等,或者C运行时库与此有关?

它不创建地址空间;这是内核的工作。内核还设置了一个堆栈。加载程序将程序和库加载到地址空间,包括将零映射到BSS段等。大多数Linux系统/程序使用GNU C库glibc附带的加载程序。

我希望BSS以及任何其他初始化的全局变量,作为加载到进程内存空间的可执行映像的一部分(因此这些变量永远不需要运行时初始化)。顺便说一下,只有一个堆栈指针。我希望可执行映像包含与程序在定义良好的段上的初始执行相关的值,以便操作系统能够正确设置寄存器(例如:SP=堆栈基址,PC=主的地址,等等).@barakmanos:单线程进程只有一个堆栈指针(因此启动时的进程只有一个堆栈指针),但多线程进程的每个线程都有一个单独的堆栈指针。@barakmanos:ELF可执行文件没有BSS段。BSS段由加载程序或运行时初始化设置-我的问题。就堆栈而言,地址空间是随机的,因此堆栈不会有编译器已知的固定地址。@JonathanLeffler:但是线程(及其上下文,其中包括SP值)只能在运行时创建,那么操作系统在加载时如何设置SP值?我的意思是,在执行开始时,只有一个堆栈指针。加载程序调整可执行代码以匹配加载代码的实际VM地址。当加载冲突发生时,例如,两个模块试图在同一地址加载,或者该地址已经提交给其他对象(如heap或mmap)时,它并不总是预期的地址。或ASLR。顺便说一句,PIC在Linux上非常常见。详细说明见。那么运行时初始化做什么?@Tapanand:它需要做什么。加载器几乎只是将可执行文件和库加载到地址空间,并处理可能需要进行的任何重新定位;其他库(包括libc)将自行进行适当的初始化。谁将bss初始化为零,然后由谁设置堆栈?答案如下: