ELF头文件中的p_align是什么?

4

我正在学习反向工程。

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 和一些文档,但我仍然不太明白它的意思。 在 stack overflow 上也有一些关于这个问题的提问,但都没有答案。

你能向我解释一下吗?


可能有帮助:https://www.intezer.com/blog/research/executable-linkable-format-101-part1-sections-segments/ - Adriano Repetti
@AdrianoRepetti 谢谢,但我已经阅读过了。 - JaeIL Ryu
那个链接回答了你的问题。 - Maxim Egorushkin
1个回答

1
如果您使用的是Linux系统,请在终端中键入man elf以阅读有关ELF格式的当前文档。在readelf输出中,字段Align是程序头的p_align。这里是在线文档的一部分:

p_align

此成员保存段在内存和文件中对齐的值。可加载进程段必须具有模除页面大小的 p_vaddr 和 p_offset 的同余值。值为零和一表示不需要对齐。否则, p_align 应该是正的、整数次幂二, p_vaddr 应该等于 p_offset ,模 p_align。


3
是的,我看了那个描述。但我不明白如何使用p_align。 p_align值确切意味着什么?0x1、0x0、0x8、0x200000。 0x20000表示加载0x20000字节大小吗? - JaeIL Ryu
2
据我所知,它意味着分段部分的最小块大小。例如,如果您有Align 8,并且您的段以偏移量9(十进制)结束,则第10-15个字节将未使用。这意味着没有其他段可以占用它。 - Dmitry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接