macOS size命令显示的数字很大吗?

时间:2019-05-02 04:28:25

标签: macos unix

> size /bin/ls
__TEXT  __DATA  __OBJC  others  dec hex
20480   4096    0   4294983680  4295008256  10000a000

ls是4GB怎么可能? size是否不打算在可执行文件上使用?我有4GB的内存,是否只是向我显示它可以使用的内存量?

2 个答案:

答案 0 :(得分:4)

在macOS上,默认情况下64位应用程序的页面零为4GB。页面零是地址空间中从地址0开始的块,该地址不允许访问。当程序取消引用空指针时,这就是导致访问冲突的原因。

64位Mac程序使用4GB页面零,因此,如果任何有效指针被程序错误意外截断为32位(例如,强制转换为int并返回指针),它将无效并导致崩溃。这有助于发现并修复此类错误。

Mach-O可执行文件中的页面零段实际上并未在磁盘上使用4GB。只是一些元数据告诉内核和动态加载程序要为其保留多少地址空间。看来size包括所有段的虚拟大小,无论它们是否占用磁盘空间。

此外,加载程序时,页面零也不会消耗实际的RAM。再次,只有一些簿记数据可以跟踪地址空间的较低4GB被保留的事实。

报告为“其他”的大小为4294983680字节,以十六进制0x100004000表示。那就是4GB页面零(0x100000000)加上其他部分的另外4页。

您可以对-m使用size选项以获取更多详细信息:

$ size -m /bin/ls
Segment __PAGEZERO: 4294967296
Segment __TEXT: 20480
    Section __text: 13599
    Section __stubs: 456
    Section __stub_helper: 776
    Section __const: 504
    Section __cstring: 1150
    Section __unwind_info: 148
    total 16633
Segment __DATA: 4096
    Section __got: 40
    Section __nl_symbol_ptr: 16
    Section __la_symbol_ptr: 608
    Section __const: 552
    Section __data: 40
    Section __bss: 224
    Section __common: 140
    total 1620
Segment __LINKEDIT: 16384
total 4295008256

您还可以使用命令otool -lV /bin/ls查看可执行文件的加载程序命令,包括建立__PAGEZERO段的加载程序命令。

答案 1 :(得分:1)

size命令输出与某些二进制文件executable相关的信息以及其运行方式。关于文件不是。 4Gb数字可能(只是我的猜测)与运行它所需的virtual address space有关。

我没有MacOSX操作系统(因为它是专有的,并且与我不喜欢的且价格昂贵的硬件绑定在一起)。但是在Linux(主要是POSIX,例如MacOSX)上,size /bin/ls给出了:

   text    data     bss     dec     hex filename
 124847    4672    4824  134343   20cc7 /bin/ls

ls -l /bin/ls显示时

-rwxr-xr-x 1 root root 138856 Feb 28 16:30 /bin/ls

当然,当ls运行时,它包含的某些数据(特别是bss)与可执行文件的一部分不对应

在您的系统上尝试man size以获得解释。对于Linux,请参见size(1)(给出有关ELF可执行文件的 sections 的信息)和ls(1)(给出文件的大小)。 )。

在MacOSX上,可执行文件遵循Mach-O格式。

在Linux上,如果您在size之类的不可执行文件上尝试/etc/passwd,则会得到

 size: /etc/passwd: file format not recognized

我猜如果您尝试在MacOSX上出现一些错误消息。

请考虑size提供可执行大小信息。这个名字是历史性的,有点误导人。