Как я могу использовать otool, чтобы получить размер двоичного файла?

Я использую 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,3 МБ, а 0x0000000100000000 - 4 ГБ!

Я предполагаю, что "один" в середине адреса относится к 64-битной архитектуре, и 0x0000000100000000 на самом деле адрес 0x00, Я искал некоторую информацию об этом, но я не нашел ничего полезного. Кто-нибудь может подтвердить мои предположения и объяснить, как именно это работает?

1 ответ

Решение

Там нет ничего странного.

Сначала "недопустимый сегмент" зарезервирован в нижних 4 ГБ адресного пространства. Это похоже на недопустимые 4 КБ или все, что было сохранено, чтобы вызвать сбой разыменования нулевого указателя в 32-битных процессах, только больше (это должно отлавливать, например, любое 32-битное целое число, ошибочно приведенное к указателю). В конце концов, почему бы и нет? Это виртуальная память, это бесплатно. Еще некоторые подробности здесь.

Затем ваш исполняемый текст загружается на границе 4 ГБ. Ничего плохого - имейте в виду, что младшие 4 ГБ не запекаются реальной памятью, они просто помечаются как зарезервированные.

В общем, совершенно не странно загружать вещи по "старшим" адресам в 64-битном адресном пространстве. Например, стек обычно находится в зоне чуть ниже 48-битных границ. Это не то, что система фактически должна предоставлять всю память в середине, виртуальная память делает так, что только страницы, которые содержат что-то, потребляют фактическую память (RAM или пространство подкачки). (на самом деле, есть некоторая стоимость в бухгалтерии структур данных страницы, но обычно она незначительна)

Вместо этого размер двоичного файла указывается как в поле размера виртуальной машины, так и в поле размера файла (0x268000 = 2523136 ≈ 2,4 МБ).

Другие вопросы по тегам