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

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

04.05.2018 09:39:34 Просмотров 25 Источник

Смотрю лекции, и делается следующее: мы имеем исполняемый файл. Хотим установить адрес первой исполняемой инструкции. Это делаем двумя путями.

Первый путь: запускаем файл и смотрим адрес main Второй путь: читаем при помощи какой то утилиты исполняемый файл и получаем адрес точки входа

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

У вопроса есть решение - Посмотреть?

https://ru.stackoverflow.com/questions/823000/%d0%90%d0%b4%d1%80%d0%b5%d1%81-%d0%bf%d0%b5%d1%80%d0%b2%d0%be%d0%b9-%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d0%bd%d1%8f%d0%b5%d0%bc%d0%be%d0%b9-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%ba%d1%86%d0%b8%d0%b8#comment1310804_823000
Лектор говорит правильно. Это именно адрес, не смещение. но адрес в виртуальной памяти, не в физической.
https://ru.stackoverflow.com/questions/823000/%d0%90%d0%b4%d1%80%d0%b5%d1%81-%d0%bf%d0%b5%d1%80%d0%b2%d0%be%d0%b9-%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d0%bd%d1%8f%d0%b5%d0%bc%d0%be%d0%b9-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%ba%d1%86%d0%b8%d0%b8#comment1316982_823000
"...и не загружен в оперативку"? А при чем здесь "оперативка"? В системах с виртуальной памятью адреса "оперативки" никакой роли не играют вообще.

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

Harry

04.05.2018 09:53:26

Адрес main - совсем не первая исполняемая инструкция. Перед этим выполняется масса разных действий...

А адрес указывается в заголовке файла (если не считать DOS'овских .com-файлов, которые загружались в память с 256-го байта сегмента памяти и выполнялись с первой команды).

У каждого варианта выполнимого файла - свой формат, так что с каждым надо разбираться отдельно, где именно лежит этот адрес в файле. Но операционная система знает, где его прочесть и как передать ему управление после загрузки в память и подготовительных действий.

Вот, например, как это делалось в DOS. В Unix, понятно, структура иная, но принцип остается тем же - выполнимый файл содержит не только код, но и информацию о том, как им воспользоваться.

Update Рекомендую книжицу "Операционные системы", там об этом неплохо рассказывается. Что старая - не так важно, я смотрел издание 2017 года - особой разницы нет, по крайней мере в таких глобальных вещах, как процессы, память и т.п.

https://ru.stackoverflow.com/questions/823000/%d0%90%d0%b4%d1%80%d0%b5%d1%81-%d0%bf%d0%b5%d1%80%d0%b2%d0%be%d0%b9-%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d0%bd%d1%8f%d0%b5%d0%bc%d0%be%d0%b9-%d0%b8%d0%bd%d1%81%d1%82%d1%80%d1%83%d0%ba%d1%86%d0%b8%d0%b8/823013#comment1310799_823013
Думаю, стоит добавить, что для каждого процесса система маппит адреса. И потому это вовсе не странно для программы - знать заранее, где будут её инструкции.
Denys Save

04.05.2018 12:40:30

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

aleksandr barakin

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
...
AnT

10.05.2018 07:24:22

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

Во-вторых, не совсем ясно, что вызвало ваш вопрос о хранении адреса точки входа в исполняемом файле. Расположение исполняемого кода вашей программы в виртуальной памяти процесса известно заранее, еще на стадии линковки программы, по каковой причине нет ничего необычного в том, что адрес точки входа явным образом записан в файл. Т.е. это никакое не смещение, а прямой адрес.

Закрыть X