如何使用 otool 获取二进制文件的大小?
How can I use otool to get the size of a binary file?
我正在使用 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 __TEXT
从 vmaddr 0x0000000100000000
开始
问题是二进制大小是 2.3MB 而 0x0000000100000000 是 4GB!
我假设地址中间的"one"与64位架构有关,0x0000000100000000
实际上是地址0x00
。我正在寻找有关此的一些信息,但没有找到任何有用的信息。任何人都可以证实我的假设并解释这是如何工作的吗?
没有什么奇怪的。
首先在地址space的低4GB中保留了一个"invalid segment"。这就像无效的 4 KB 或任何使 NULL 指针取消引用在 32 位进程中崩溃的东西,只是更大(这也应该捕获,例如,任何错误地转换为指针的 32 位整数)。毕竟,为什么不呢?它是虚拟内存,它是免费的。 Some more details here。
然后,您的可执行文本将加载到 4 GB 边界。没什么不好的 - 请记住,较低的 4 GB 不是由实际内存烘焙的,它们只是被标记为保留。
一般来说,在64位地址space中的"high"地址加载东西绝对不奇怪。例如,堆栈通常位于 48 位边界正下方的区域中。这不像系统实际上必须在中间提供所有内存,虚拟内存使得只有包含某些内容的页面消耗实际内存(RAM 或交换 space)。 (实际上,页面数据结构簿记有一些成本,但一般可以忽略不计)
二进制文件的大小在 VM 大小字段和文件大小字段中报告 (0x268000 = 2523136 ≈ 2.4 MB)。
我正在使用 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 __TEXT
从 vmaddr 0x0000000100000000
问题是二进制大小是 2.3MB 而 0x0000000100000000 是 4GB!
我假设地址中间的"one"与64位架构有关,0x0000000100000000
实际上是地址0x00
。我正在寻找有关此的一些信息,但没有找到任何有用的信息。任何人都可以证实我的假设并解释这是如何工作的吗?
没有什么奇怪的。
首先在地址space的低4GB中保留了一个"invalid segment"。这就像无效的 4 KB 或任何使 NULL 指针取消引用在 32 位进程中崩溃的东西,只是更大(这也应该捕获,例如,任何错误地转换为指针的 32 位整数)。毕竟,为什么不呢?它是虚拟内存,它是免费的。 Some more details here。
然后,您的可执行文本将加载到 4 GB 边界。没什么不好的 - 请记住,较低的 4 GB 不是由实际内存烘焙的,它们只是被标记为保留。
一般来说,在64位地址space中的"high"地址加载东西绝对不奇怪。例如,堆栈通常位于 48 位边界正下方的区域中。这不像系统实际上必须在中间提供所有内存,虚拟内存使得只有包含某些内容的页面消耗实际内存(RAM 或交换 space)。 (实际上,页面数据结构簿记有一些成本,但一般可以忽略不计)
二进制文件的大小在 VM 大小字段和文件大小字段中报告 (0x268000 = 2523136 ≈ 2.4 MB)。