【每日一识】程序的运行

  1. 一个可执行文件由不用的section组成,分为代码段,数据段,bss段等。加载器在加载程序运行时,会将这些代码段,数据段分别加载到内存中不同位置。可执行文件的文件头提供了文件类型,运行平台,程序的入口地址等基本信息,加载器在家在程序之前会首先根据文件头的信息做一些判断,如果发现程序的运行平台和当前的环境不符,则会报出错处理。

    【每日一识】程序的运行_第1张图片 除此之外,可执行文件中还有一个叫做program header table 的section (段头表),段头表中记录的是如何将可执行文件加载到内存的相关信息,包括可执行文件中要加载到内存中的段,入口地址等信息。可重定位目标文件因为是不可置信的,不需要加载到内存中,所以段头表这个section在目标文件中不是必须存在的是可选的。而在一个可执行文件中,加载器要加载程序到内存,要依赖段头表所提供的信息,因此段头表是必须的。我们可以使用readelf 命令查看可执行文件的段头表。

  2. 在linux 环境中运行的程序一般都会被封装成进程,参与操作系统的统一调度和运行。在shell环境下执行一个程序,shell终端一般会先fork一个子进程,创建一个独立的虚拟进程地址客供件,接着调用execve函数将要运行的程序加载到进程空间。通过可执行文件的文件头,找到程序的入口地址,建立进程虚拟地址空间与可执行文件的映射关系,将pc指针设置为可执行文件的入口地址,即可启动运行。如下一段c程序,编译生成的可执行文件,可执行文件运行时的进程之间的对应关系如下:

【每日一识】程序的运行_第2张图片

3.程序在内存中的地址分布

【每日一识】程序的运行_第3张图片

你可能感兴趣的:(每日一识,linux,运维,服务器)