Как я могу использовать 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 МБ).