p_align:段在文件和内存中的对齐要求。通常为2的幂。 程序头的类型(p_type)详细说明 PT_LOAD:表示一个可加载的段,加载器将根据此段的信息将文件内容映射到进程的地址空间,通常包含以下两个可装载的段:存放程序代码的 text 段以及存放全局变量和动态链接信息的 data 段,上面的两个段将会被映射到内存中,并根据...
ELF文件格式最重要的就是所谓的段,特别是其中的代码段和数据段。对应上图就是.text,.data两个段。每个段都对应一个段表来描述,而若干隔断会组成一个整体,它对应一个program,而后者则由program header table来指向,讲解ELF数据结构最为详细的就是网址如下,有心的朋友可以认真阅读: https://man7.org/linux/ma...
数据段(.data)保存的是哪些已经初始化(非零)的全局变量(静态变量和非静态变量)和局部静态变量。 gint_val 和 static_val 存在数据段。0x64 和 0x65 刚好对应 100 和 101(ASCII d 和 e) 数据段是 16 字节对齐所以刚好占 16 个字节大小。对齐和平台有关。 只读数据段 只读数据段(.rodata),保存的是只读...
Program header描述的是一个段在文件中的位置、大小以及它被放进内存后所在的位置和大小。 typedef struct {Elf64_Wordp_type; Elf64_Word p_flags; Elf64_Offp_offset;Elf64_Addr p_vaddr;Elf64_Addr p_paddr;Elf64_Wordp_filesz;Elf64_Word p_memsz;Elf64_Word p_align;} p_type 当前Program head...
总的来说,段是没有名字的,但我们往往把包含text节的段叫做代码(text)段,把含有data节的段叫做数据(data)段。一定程度上在口述时习惯也可以理解为 "段 = 节",例如bss段,rodata段,实际他们指bss节,rodata节。甚至有时候我们说text段就狭义的指text节,完全不用太纠结。
text data bss dec hex filename1056437285436153c a.out 这次bss段值没变,而数据段多了4372 - 252 = 4120,为什么不是4096,说明data段应该也是32字节对齐的。细心的同学肯定发现了,a.out的大小增加 了4K,这说明什么,说明a[1024]数据被写入了ELF文件中,也就是说data段中变量的值全部被写入到了ELF文件中。那...
程序段 Program segment 一个程序段对应于一个加载域,并且包含执行域。 程序段包含文本和数据等信息。 存在XO( execute-only)节时的注意事项 您可以在同一执行域中混合 XO 和非 XO 节。 但是,输出的结果是一个 RO 节。 如果输入文件具有一个或多个 XO 节,则链接器将生成单独的 XO ELF 段。 在最终镜像中...
使用工具查看段表信息 readelf -S obj (1)找到段表 在文件头中e_shoff可以找到段表偏移地址00 00 00 00 00 00 02 90,从这个地址去查找段表。 段表长度由e_ehentsize为00 40(64字节)。 段表个数由e_shnum可知有13个。 /usr/include/elf.h中可以找到段表结构: ...
数据段(.data)和只读数据段(.rodata) .data段保存的是那些已经初始化了的全局静态变量和局部静态变量。前面SimpleSection.c代码里面一共有两个这样的变量,都是int类型的,一共刚好8字节。 在SimpleSection.c里在调用”printf”的时候,用到了一个字符串常量”%d\n”,它是一种只读数据,所以被放到了”.rodata”段...
VirtAddr:虚拟地址,段加载至内存后的虚拟地址。 PhysAddr:物理地址:段的物理地址。 FileSiz:文件大小,段在文件中大小。 MemSiz:内存大小,段在内存中大小。 Flags:段标识,段属性:只读属性(R),只写属性(W),可执行属性(E)。 Align:对齐方式。 2.3 节区 ...