Команда macOS size показывает действительно большое число? - PullRequest
0 голосов
/ 02 мая 2019
> size /bin/ls
__TEXT  __DATA  __OBJC  others  dec hex
20480   4096    0   4294983680  4295008256  10000a000

Как могло случиться, что ls равно 4 ГБ?size не предназначен для использования на исполняемых файлах?У меня есть 4 ГБ оперативной памяти, поэтому он просто показывает объем памяти, который он может использовать?

Ответы [ 2 ]

4 голосов
/ 02 мая 2019

В macOS 64-битные приложения по умолчанию имеют нулевой размер страницы 4 ГБ.Нулевая страница - это фрагмент адресного пространства, начинающийся с адреса 0, который не позволяет получить доступ.Это то, что вызывает нарушения прав доступа, когда программа разыменовывает нулевой указатель.

64-разрядные программы Mac используют ноль страницы 4 ГБ, так что любой допустимый указатель может быть случайно урезан до 32 бит в результате ошибки программы (например, приведениедо int и обратно к указателю), он будет недействительным и вызовет сбой в кратчайшие возможные сроки.Это помогает находить и исправлять такие ошибки.

Сегмент нулевой страницы в исполняемом файле Mach-O фактически не использует 4 ГБ на диске.Это всего лишь метаданные, которые сообщают ядру и динамическому загрузчику, сколько адресного пространства зарезервировать для него.Похоже, что size включает в себя виртуальный размер всех сегментов, независимо от того, занимают ли они место на диске или нет.

Кроме того, нулевая страница не потребляет фактическую память при загрузке программы,или.Опять же, есть только некоторые бухгалтерские данные для отслеживания того факта, что зарезервированы 4 ГБ адресного пространства меньшего размера.

Размер, сообщаемый для «других», 4294983680 байт, равен 0x100004000 в шестнадцатеричном формате.Это ноль страницы 4 ГБ (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 голос
/ 02 мая 2019

Команда size выводит информацию, касающуюся некоторого двоичного исполняемого файла и его запуска. Это не о файле. Число 4Gb может быть (это только мое предположение) связано с виртуальным адресным пространством , необходимым для его запуска.

У меня нет операционной системы 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 ) и ls (1) (it дает файл размер).

В MacOSX исполняемые файлы следуют формату Mach-O .

В Linux, если вы попытаетесь size для неисполняемого файла, такого как /etc/passwd, вы получите

 size: /etc/passwd: file format not recognized

и я думаю, у вас должно появиться сообщение об ошибке в MacOSX, если вы попробуете это.

Подумайте о size предоставлении исполняемого файла информации о размере. Название историческое и немного вводящее в заблуждение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...