首先明确Segment和section间的区别,Program Head中的内容叫做Segment,它是由多个Section组成;Program Head中描述的是程序运行起来后的内存视图,而ELF Head和Section Head是文件视图,一个是动态的,一个是静态的。 typedefstruct{Elf32_Wordp_type;/* Segment type */Elf32_Offp
目标代码文件中的section和section header table中的条目是一一对应的。section的信息用于链接器对代码重定位。 而文件载入内存执行时,是以segment组织的,每个segment对应ELF文件中program header table中的一个条目,用来建立可执行文件的进程映像。 比如我们通常说的,代码段、数据段是segment,目标代码中的section会被链接...
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; /* ...
上图program header table 实际上就是我们说的segment table. segments 是从执行的角度来描写叙述elf文件, sections是从链接的角度来描写叙述elf文件的。 本节我们仅仅将elf文件的运行,所以我们仅仅讲segment相关的内容。 我们将通过一个样例来解说系统载入elf的过程(64位平台)。 我们编写一个简单的汇编程序 .section ...
也就是说,链接器只关心 ELF header, Sections 以及 Section header table 这 3 部分内容。 加载器在看我的时候,它的眼睛里是另外的 3 部分内容: 加载器只关心 ELF header, Program header table 和 Segment 这 3 部分内容。 对了,从加载器的角度看,对于中间部分的Sections, 它改了个名字,叫做Segments(段)...
program header和文件中的segment一一对应,因为目标代码文件中没有segment,program header也就没有必要了。 可执行文件的内容组织成segment,因此program header table是必须的。 section header不是必须的,但没有strip过的二进制文件中都含有此信息。 对本地可执行文件sleep执行readelf -l sleep,输出如下: ...
也就是说,链接器只关心ELF header, Sections 以及 Section header table这 3 部分内容。 加载器在看我的时候,它的眼睛里是另外的 3 部分内容: 加载器只关心ELF header, Program header table 和 Segment这 3 部分内容。 对了,从加载器的角度看,对于中间部分的 Sections , 它改了个名字,叫做 Segments (段)...
也就是说,链接器只关心 ELF header, Sections 以及Section header table这 3 部分内容。 加载器在看我的时候,它的眼睛里是另外的 3 部分内容: 加载器只关心 ELF header,Program header table和 Segment 这 3 部分内容。 对了,从加载器的角度看,对于中间部分的ode>Sections, 它改了个名字,叫做Segments(段)。
ELF文件由4部分组成,分别是ELF头(ELF header)、程序头表(Program header table)、节(Section)和节头表(Section header table)。实际上,一个文件中不一定包含全部内容,而且它们的位置也未必如同所示这样安排,只有ELF头的位置是固定的,其余各部分的位置、大小等信息由ELF头中的各项值来决定。
Linux 可执行文件 ELF结构 及程序载入执行 Linux下ELF文件类型分为以下几种: 1、可重定位文件,比如SimpleSection.o; 2、可运行文件,比如/bin/bash。 3、共享目标文件,比如/lib/libc.so。 在Linux 可重定位文件 ELF结构一文中,我们已经分析了可重定位文件ELF结构。