了解 ELF64 text/data 段 layout/padding

Understanding ELF64 text/data segment layout/padding

我正在复习 UNIX 病毒,我正在阅读的一篇文章提到寄生代码可以插入到文本和数据段之间的填充中,据推测在 x86-64 上大小可达 2MB系统。但是当我用 gcc -no-pie...

编译一个简单的 hello world 程序时
#include <stdio.h>

int main()
{
  printf("hello world\n");
}

...并用 readelf -W -l 检查其段 headers 我得到:

Program Headers:
  Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align
  PHDR           0x000040 0x0000000000400040 0x0000000000400040 0x0002d8 0x0002d8 R   0x8
  INTERP         0x000318 0x0000000000400318 0x0000000000400318 0x00001c 0x00001c R   0x1
      [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
  LOAD           0x000000 0x0000000000400000 0x0000000000400000 0x000588 0x000588 R   0x1000
  LOAD           0x001000 0x0000000000401000 0x0000000000401000 0x0001c5 0x0001c5 R E 0x1000
  LOAD           0x002000 0x0000000000402000 0x0000000000402000 0x000138 0x000138 R   0x1000
  LOAD           0x002e00 0x0000000000403e00 0x0000000000403e00 0x000230 0x000238 RW  0x1000
  DYNAMIC        0x002e10 0x0000000000403e10 0x0000000000403e10 0x0001d0 0x0001d0 RW  0x8
  ...

我假设从虚拟地址 0x401000 开始的段是文本段,从 0x430e00 开始的段是数据段。但是另外两个 read-only LOAD 段是什么?填充在这里的工作精确度如何?没有看到 2MB 边界的填充,甚至假设填充到 4KB 边界,为什么数据段不从地址 0x403000 开始?

But what are the other two read-only LOAD segment?

There's no padding to 2MB boundaries

BFD 链接器用于在 2MiB 边界上对齐段,因为这是 x86_64 系统可以配置的最大页面大小。

它不再这样做(不确定何时进行更改)。
您正在阅读的文字可能已过时。