AI代码解释 typedef struct{uint32_t p_type;(segment type)Elf32_Off p_offset;(segment offset)Elf32_Addr p_vaddr;(segment virtual address)Elf32_Addr p_paddr;(segment physical address)uint32_t p_filesz;(sizeofsegmentin
首先明确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...
AL: 某些节区带有地址对齐约束 -l:查看段(segment)信息及节与段之间的映射关系,其输出字段为: Type:段类型,其含义如下: Offset:该段在距离文件开头的偏移地址 VirtAddr:此成员给出段的第一个字节将被放到内存中的虚拟地址 PhysAddr:此成员仅用于与物理地址相关的系统中 FileSiz:此成员给出段在文件映像中所占的...
program header用于描述segment的特性(多个section被组合成segment,Section to Segment mapping字段描述了其对应关系): Offset表示该segment相对ELF文件开头的偏移量; FileSiz表示该segment在ELF文件中的大小,MemSiz表示该segment加载到内存后所占用的大小。FileSiz和MemSiz的大小只有在少数情况下不相同; VirtAddr表示segment...
如果看过之前的文章ELF文件之动手写ELF Head解析器、ELF文件之动手写Section Head解析器、ELF文件之动手写ELF Program Head解析器,应该就可以很好的理解这个函数,主要就是加载elf文件,然后解析Program Head,找到类型为PT_LOAD的Segment加载到内存中,加载之前需要调用elf_map函数做内存映射。下面看看这个函数具体实现情况。
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; /* ...
ELF 是Executable and Linking Format的缩写,即可执行和可链接的格式,是Unix/Linux系统ABI (Application Binary Interface)规范的一部分。 Unix/Linux下的可执行二进制文件、目标代码文件、共享库文件和core dump文件都属于ELF文件。 下面的图来自于文档Executable and Linkable Format (ELF),描述了ELF文件的大致布局。
从图中可见,分为6个Segment。 注意表1中每一个段叫Section。 Offset:这个Segment在文件里偏移。 VirtAddr:这个Segment在虚拟地址的偏移。 FileSiz:在ELF文件里所占的长度。 MemSiz:在进程虚拟空间所占的长度。 我们发现第二个Segment,MemSiz > FileSiz,表示在内存中分配的空间大小超过文件实际大小。
可执行与可链接格式 (Executable and Linkable Format,ELF),常被称为 ELF格式,是一种用于可执行文件、目标代码、共享库和核心转储(core dump)的标准文件格式,一般用于类Unix系统,比如Linux,Macox等。ELF 格式灵活性高、可扩展,并且跨平台。比如它支持不同的字节序和地址范围,所以它不会不兼容某一特别的 ...
加载器只关心ELF header, Program header table 和 Segment这 3 部分内容。 对了,从加载器的角度看,对于中间部分的 Sections , 它改了个名字,叫做 Segments (段)。换汤不换药,本质上都是一样一样的。 可以理解为:一个 Segment 可能包含一个或者多个 Sections,就像下面这样: ...