1

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

程序标题:
  类型 偏移 VirtAddr PhysAddr
                 FileSiz MemSiz 标志对齐
  PHDR 0x00000000000000040 0x0000000000400040 0x0000000000400040
                 0x00000000000001f8 0x00000000000001f8 RE 8
  INTERP 0x00000000000000238 0x0000000000400238 0x0000000000400238
                 0x000000000000001a 0x000000000000001a R 1
      [请求程序解释器:/lib/ld-linux-x86-64.so.2]
  加载 0x00000000000000000 0x0000000000400000 0x0000000000400000
                 0x00000000000aeef4 0x00000000000aeef4 RE 200000
  加载 0x00000000000afde0 0x00000000006afde0 0x00000000006afde0
                 0x0000000000003cec 0x000000000000d3c8   RW 200000
  动态 0x00000000000afdf8 0x00000000006afdf8 0x00000000006afdf8
                 0x0000000000000200 0x0000000000000200 RW 8
  注意 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不等于?应该如何处理包含但不包含的内存区域?FileSizLOADMemSizFileSiz

4

1 回答 1

7

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

程序中的数据段包含已初始化和未初始化程序变量的空间。初始化变量的值存储在程序的可执行文件中。未初始化的程序变量不需要存储在任何地方;而是在名为“.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”部分的数据段部分将在程序加载时填充为零。

于 2012-11-18T06:18:57.983 回答