Адрес первой исполняемой инструкции
Смотрю лекции, и делается следующее: мы имеем исполняемый файл. Хотим установить адрес первой исполняемой инструкции. Это делаем двумя путями.
Первый путь: запускаем файл и смотрим адрес main Второй путь: читаем при помощи какой то утилиты исполняемый файл и получаем адрес точки входа
Вопрос: как может вообще храниться адрес в исполняемом файле, если он лежит в файловой системе и не загружен в оперативку? У меня есть предположение что адрес точки входа это может быть смещение относительно начала файла(лектор говорит что это именно адрес, а не смещение). Так ли это?


Ответы - Адрес первой исполняемой инструкции / Адрес первой исполняемой инструкции

04.05.2018 09:53:26
Адрес main
- совсем не первая исполняемая инструкция. Перед этим выполняется масса разных действий...
А адрес указывается в заголовке файла (если не считать DOS'овских .com-файлов, которые загружались в память с 256-го байта сегмента памяти и выполнялись с первой команды).
У каждого варианта выполнимого файла - свой формат, так что с каждым надо разбираться отдельно, где именно лежит этот адрес в файле. Но операционная система знает, где его прочесть и как передать ему управление после загрузки в память и подготовительных действий.
Вот, например, как это делалось в DOS. В Unix, понятно, структура иная, но принцип остается тем же - выполнимый файл содержит не только код, но и информацию о том, как им воспользоваться.
Update Рекомендую книжицу "Операционные системы", там об этом неплохо рассказывается. Что старая - не так важно, я смотрел издание 2017 года - особой разницы нет, по крайней мере в таких глобальных вещах, как процессы, память и т.п.


04.05.2018 12:40:30
В UNIX-подобных системах используется ELF-формат исполняемого файла, в заголовке которого среди прочей информации (тип файла, тип системы и т.п) указан также виртуальный адрес точки входа, которому система передает управление при запуске процесса.

10.05.2018 06:24:59
просто в виде дополнения к ответу @DenysSave
точку входа в исполняемом файле формата elf можно получить многими путями. например:
$ readelf -h /bin/true | grep -i entry
Entry point address: 0x1670
или:
$ objdump -f /bin/true | grep -i start
start address 0x0000000000001670
или прямо в gdb:
$ gdb /bin/true
...
(gdb) info files
`/bin/true', file type elf64-x86-64.
Entry point: 0x1670
...

10.05.2018 07:24:22
Во-первых, адрес первой исполняемой инструкции в программе обычно никак не связан с функцией main
. Поэтому не ясно, как вы собирались решать вашу задачу через "адрес main
". Если и идти по этому пути, то вам нужно искать адрес _start
, а не адрес main
.
Во-вторых, не совсем ясно, что вызвало ваш вопрос о хранении адреса точки входа в исполняемом файле. Расположение исполняемого кода вашей программы в виртуальной памяти процесса известно заранее, еще на стадии линковки программы, по каковой причине нет ничего необычного в том, что адрес точки входа явным образом записан в файл. Т.е. это никакое не смещение, а прямой адрес.