elf标头中的p_align是什么?

问题描述

我正在研究逆向工程。

readelf something
Program Headers:
  Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align
  PHDR           0x000040 0x0000000000400040 0x0000000000400040 0x0001f8 0x0001f8 R   0x8
  INTERP         0x000238 0x0000000000400238 0x0000000000400238 0x00001c 0x00001c R   0x1
      [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
  LOAD           0x000000 0x0000000000400000 0x0000000000400000 0x0006f0 0x0006f0 R E 0x200000
  LOAD           0x000e10 0x0000000000600e10 0x0000000000600e10 0x000220 0x000228 RW  0x200000
  DYNAMIC        0x000e20 0x0000000000600e20 0x0000000000600e20 0x0001d0 0x0001d0 RW  0x8
  NOTE           0x000254 0x0000000000400254 0x0000000000400254 0x000044 0x000044 R   0x4
  GNU_EH_FRAME   0x0005b4 0x00000000004005b4 0x00000000004005b4 0x00003c 0x00003c R   0x4
  GNU_STACK      0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW  0x10
  GNU_RELRO      0x000e10 0x0000000000600e10 0x0000000000600e10 0x0001f0 0x0001f0 R   0x1

在这里。 对齐列是什么意思?

我阅读了man(5)elf.h和一些文档,但我仍然不完全知道。 并且在堆栈溢出中对此有一些疑问,但是没有答案。

能向我解释吗?

解决方法

如果您使用的是Linux,请在终端中键入man elf,然后阅读有关ELF格式的最新文档。 Align输出中的字段readelf是程序头文件的p_align。这是online docs的一部分:

p_align

此成员保存段与之对齐的值 内存和文件中。可装载过程段必须具有一致 p_vaddr和p_offset的值,以页面大小为模。零值 一种意味着不需要对齐。否则,p_align应该是 正整数为2的幂,且p_vaddr应该等于p_offset, 取模p_align。