ELF程序标题:MemSiz与FileSiz

时间:2012-11-18 05:22:02

标签: linux elf memory-alignment readelf

readelf -l /bin/bash给了我这个:

Program Headers:
  Type           Offset             VirtAddr           PhysAddr
                 FileSiz            MemSiz              Flags  Align
  PHDR           0x0000000000000040 0x0000000000400040 0x0000000000400040
                 0x00000000000001f8 0x00000000000001f8  R E    8
  INTERP         0x0000000000000238 0x0000000000400238 0x0000000000400238
                 0x000000000000001a 0x000000000000001a  R      1
      [Requesting program interpreter: /lib/ld-linux-x86-64.so.2]
  LOAD           0x0000000000000000 0x0000000000400000 0x0000000000400000
                 0x00000000000aeef4 0x00000000000aeef4  R E    200000
  LOAD           0x00000000000afde0 0x00000000006afde0 0x00000000006afde0
                 0x0000000000003cec 0x000000000000d3c8  RW     200000
  DYNAMIC        0x00000000000afdf8 0x00000000006afdf8 0x00000000006afdf8
                 0x0000000000000200 0x0000000000000200  RW     8
  NOTE           0x0000000000000254 0x0000000000400254 0x0000000000400254
                 0x0000000000000044 0x0000000000000044  R      4
  GNU_EH_FRAME   0x000000000009dbc0 0x000000000049dbc0 0x000000000049dbc0
                 0x0000000000002bb4 0x0000000000002bb4  R      4
  GNU_STACK      0x0000000000000000 0x0000000000000000 0x0000000000000000
                 0x0000000000000000 0x0000000000000000  RW     8
  GNU_RELRO      0x00000000000afde0 0x00000000006afde0 0x00000000006afde0
                 0x0000000000000220 0x0000000000000220  R      1

为什么某些MemSiz段的FileSiz不等于LOAD?对MemSiz但不包括FileSiz

所包含的内存区域应该怎么办?

1 个答案:

答案 0 :(得分:5)

有问题的可加载段似乎是程序的数据段。

程序中的数据段包含初始化和 未初始化的程序变量。初始化变量的值是 存储在程序的可执行文件中。未初始化的程序变量没有 需要存放在任何地方;相反,空间是为他们保留的 名为“.bss”的特殊零大小部分。

可执行文件数据段的文件大小因此可以小于 它的内存大小。

举例说明:

/*
 * Space for the intialized variable 'x' would be reserved the
 * executable's ".data" section, along with its initial value.
 */
int x = 42;

/*
 * Space for the uninitialized variable 'y' would be reserved in
 * the ".bss" section; no file space would be allocated in the
 * executable.
 */
int y;

在类似unix的系统上,数据段的部分映射到 “.bss”部分将在程序加载时填零。