> size /bin/ls
__TEXT __DATA __OBJC others dec hex
20480 4096 0 4294983680 4295008256 10000a000
ls
是4GB怎么可能? size
是否不打算在可执行文件上使用?我有4GB的内存,是否只是向我显示它可以使用的内存量?
答案 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
提供可执行大小信息。这个名字是历史性的,有点误导人。