如何使用otool获取二进制文件的大小?

时间:2016-08-14 05:28:46

标签: virtual-memory segments otool executable-format

我正在使用otool来获取有关我的二进制文件的信息。以下是我输出的一部分:

Load command 0
      cmd LC_SEGMENT_64
  cmdsize 72
  segname __PAGEZERO
   vmaddr 0x0000000000000000
   vmsize 0x0000000100000000
  fileoff 0
 filesize 0
  maxprot 0x00000000
 initprot 0x00000000
   nsects 0
    flags 0x0
Load command 1
      cmd LC_SEGMENT_64
  cmdsize 952
  segname __TEXT
   vmaddr 0x0000000100000000
   vmsize 0x0000000000268000
  fileoff 0
 filesize 2523136
  maxprot 0x00000005
 initprot 0x00000005
   nsects 11
    flags 0x0

我们在此处可以看到command 1 segname __TEXTvmaddr 0x0000000100000000开始

问题是二进制大小是2.3MB而0x0000000100000000是4 GB!

我假设地址中间的“one”与64位架构有关,而0x0000000100000000实际上是地址0x00。我正在寻找一些有关这方面的信息,但我没有找到任何有用的信息。任何人都可以确认我的假设并解释这究竟是如何起作用的吗?

1 个答案:

答案 0 :(得分:1)

没什么奇怪的。

首先,在地址空间的低4 GB中保留“无效段”。这类似于无效的4 KB或其他任何保留,以使NULL指针取消引用在32位进程中崩溃,只是更大(这也应该捕获,例如,任何错误地转换为指针的32位整数)。毕竟,为什么不呢?这是虚拟内存,它是免费的。 Some more details here

然后,您的可执行文本将加载到4 GB边界。没什么不好 - 请记住,较低的4 GB没有被实际内存烘焙,它们只是标记为保留。

一般来说,在64位地址空间中将东西加载到“高”地址绝对不奇怪。例如,堆栈通常位于48位边界正下方的区域中。它不像系统实际上在中间提供所有内存,虚拟内存使得只有包含某些东西的页面消耗实际内存(RAM或交换空间)。 (实际上,页面数据结构簿记有一些成本,但通常可以忽略不计)

而是在VM大小字段和文件大小字段(0x268000 =2523136≈2.4MB)中报告二进制文件的大小。