load_elf_phdrs 加载程序头表 load_elf_phdrs函数就是通过kernel_read读入整个program header table 从函数代码中可以看到,一个可执行程序必须至少有一个段(segment), 而所有段的大小之和不能超过64K。 */ elf_phdata = load_elf_phdrs(&loc->elf_ex, bprm->file); if (!elf_phdata) goto out; /* ...
首先明确Segment和section间的区别,Program Head中的内容叫做Segment,它是由多个Section组成;Program Head中描述的是程序运行起来后的内存视图,而ELF Head和Section Head是文件视图,一个是动态的,一个是静态的。 typedefstruct{Elf32_Wordp_type;/* Segment type */Elf32_Offp_offset;/* Segment file offset */El...
如果看过之前的文章ELF文件之动手写ELF Head解析器、ELF文件之动手写Section Head解析器、ELF文件之动手写ELF Program Head解析器,应该就可以很好的理解这个函数,主要就是加载elf文件,然后解析Program Head,找到类型为PT_LOAD的Segment加载到内存中,加载之前需要调用elf_map函数做内存映射。下面看看这个函数具体实现情况。
下图是Linux内核代码中与ELF文件的装载相关的一些代码: /fs/binfmt_elf.c中 Load_elf_binary的代码走读: 检查ELF文件头部信息(一致性检查) 加载程序头表(可以看到一个可执行程序必须至少有一个段(segment),而所有段的大小之和不能超过64K(65536u)) 寻找和处理解释器段(动态链接部分会介绍) 装入目标程序的段(elf...
开头我还告诉过你:Section与Segment本质上是一样的,可以理解为:一个 Secgment 由一个或多个 Sections 组成。 从上图中可以看到,第2个program header这个段,由那么多的Section组成,这下更明白一些了吧?! 从图中还可以看到,一共有2个LOAD类型的段:
PT_LOAD: This segment is a loadable segment. PT_DYNAMIC: This array element specifies dynamic linking information. PT_INTERP: This element specified the location and size of a null-terminated path name to invoke as an interpreter. 下面是Program header实例 ...
ELF 是Executable and Linking Format的缩写,即可执行和可链接的格式,是Unix/Linux系统ABI (Application Binary Interface)规范的一部分。 Unix/Linux下的可执行二进制文件、目标代码文件、共享库文件和core dump文件都属于ELF文件。 下面的图来自于文档Executable and Linkable Format (ELF),描述了ELF文件的大致布局。
加载器只关心ELF header, Program header table 和 Segment这 3 部分内容。 对了,从加载器的角度看,对于中间部分的 Sections , 它改了个名字,叫做 Segments (段)。换汤不换药,本质上都是一样一样的。 可以理解为:一个 Segment 可能包含一个或者多个 Sections,就像下面这样: ...
装入目标程序的段segment 这段代码从目标映像的程序头中搜索类型为PT_LOAD的段(Segment)。在二进制映像中,只有类型为PT_LOAD的段才是需要装入的。当然在装入之前,需要确定装入的地址,只要考虑的就是页面对齐,还有该段的p_vaddr域的值(上面省略这部分内容)。确定了装入地址后,就通过elf_map()建立用户空间虚拟地址...
加载器只关心 ELF header, Program header table 和 Segment 这 3 部分内容。 对了,从加载器的角度看,对于中间部分的Sections, 它改了个名字,叫做Segments(段)。换汤不换药,本质上都是一样一样的。 可以理解为:一个 Segment 可能包含一个或者多个 Sections,就像下面这样: ...