как рассчитывается?
Вы только что рассчитали сами: 0x400238 - 0x238 == 0x400000
. Ваш вопрос, вероятно, «почему именно этот адрес выбран?».
Это адрес ссылки по умолчанию для Linux x86_64
позиции зависимых двоичных файлов. Вы можете изменить этот адрес с помощью -Ttext=...
флага компоновщика. По умолчанию для ix86
(32-разрядных) двоичных файлов другое значение: 0x8048000
.
Я не уверен, почему были выбраны эти конкретные значения по умолчанию.
Есть ли программные средства? c способ определения этого?
Конечно: прочитайте Elf64_Ehdr
с начала файла. Он сообщит вам смещение к началу заголовков программы (.e_phoff
). Найдите это смещение и прочитайте Elf64_Phdr
с. Теперь итерируйте их, и их .p_vaddr
и .p_offset
будут иметь одинаковые значения.
PS. Вы просматриваете программы разделы , которые не используются и не обязательно присутствуют. в полностью связанном бинарном файле. Вы должны смотреть на программу сегментов . Используйте readelf -Wl a.out
, чтобы изучить их.