有谁知道在 shell 中的哪个位置,fork()、exec() 序列 ELF 被加载器读取和使用?可以使用Linux作为例子。
我问这个问题是因为据我了解 ELF 具有有关内存段和布局的信息。我对这些 ELF 信息的使用地点和方式感兴趣。
来自 EXECVE(2) 的更新:
如果可执行文件是包含共享库存根的 a.out 动态链接二进制可执行文件,则在执行开始时调用 Linux 动态链接器 ld.so(8),将所需的共享对象放入内存并将可执行文件与它们链接。
如果可执行文件是动态链接的 ELF 可执行文件,则使用 PT_INTERP 段中指定的解释器来加载所需的共享对象。对于与 glibc 链接的二进制文件,此解释器通常为 /lib/ld-linux.so.2(请参阅 ld-linux.so(8))。
由 LD.SO(8) 可知:
程序 ld.so 处理 a.out 二进制文件,这是很久以前使用的二进制格式。程序 ld-linux.so*(对于 libc5 为 /lib/ld-linux.so.1,对于 glibc2 为 /lib/ld-linux.so.2)处理更现代的 ELF 格式的二进制文件。
我仍然缺乏链接器编辑器如何使用 ELF 头、程序头和节头(如图所示)中的信息将原始程序数据从程序文件复制到进程的地址空间的信息。该地址空间由静态数据和文本段组成。然后就是设置SP和PC调用程序文件文本入口点的工作。
据我了解, exec() 将程序中断(分配给进程的内存的顶部)设置为静态数据和文本段大小的总和,然后将这些段复制到程序中断下的程序地址空间中。