LINUX.ORG.RU

[c++] Смещение точки входа

 


0

2

Приветствую.

Как можно вычислить смещение точки входа в ELF-файле? Изучая ELF формат я пока этого не понял. В заголовке есть только адрес. Заметил, что смещение точки входа иногда совпадает с началом кодовой секции .text и в секционном заголовке есть ее смещение, но так ведь не всегда.


ну так и в чём проблема?
чем отличается смещение точки входа (кстати, смещение от чего?) от адреса точки входа?

TERRANZ ★★★★
()
Ответ на: комментарий от TERRANZ

Есть разница. Точка входа это вроде ведь виртуальный адрес. К примеру у меня точка входа 0x80486CE, а ее смещение от начала файла 0x06CE. Смещение я посмотрел в дизассемблере. А как его вычислить программно? Ведь seek() это переход не по адресу, а по смещению.

Digan
() автор топика

Просматриваем все исполняемые сегменты - находим точку входа - находим соответствующую секцию - находим ее смещение - находим нужное смещение.

unsigned ★★★★
()
Ответ на: комментарий от unsigned

Даже проще: для каждой загружаемой секции указан адрес и размер, так что просто находим нужный адрес, потом смещение секции.

unsigned ★★★★
()
Ответ на: комментарий от unsigned

Кажется понял способ попроще. Смещение можно вычислить как EntryPoint - 0x8048000. Может кто-нибудь объяснить что-такое 0x8048000 и всегда ли оно имеет такое значание?

Digan
() автор топика
Ответ на: комментарий от Yareg

Не совсем понял вопрос. Точка входа же записывается в ELF-файл на этапе сборки, а main создается на этапе написания программы. Чаще всего конечно с точки входа и выполняется main, но не всегда же.

Digan
() автор топика
Ответ на: комментарий от Digan

Ну то есть, да, не main конечно же. Просто, ведь если руками написать, к примеру, такой код (который потом компилировать с -nostartfiles):

void doNothing(int a, int b)
{
  a+b;
}

void _start()
{
  exit(1);
}

то у него точка входа должна отличаться от остальных.

Yareg ★★★
()
Ответ на: комментарий от Digan

> Чаще всего конечно с точки входа и выполняется main

Наоборот. Чаще всего точкой входа являетя не main, а __libc_start.

LamerOk ★★★★★
()

Может, пригодится информация из отсюда и отсюда? Я читал эти статьи давно, но что-то по этому поводу, вспоминается, там было.

one_more_hokum ★★★
()
Ответ на: комментарий от one_more_hokum

Спасибо за статью, но, к сожалению, она сложно читается если плохо знаком с PE форматом. Я лучше знаком с ELF - форматом.

На данный момент мне нужно подтверждение слов отсюда http://ru.w3support.net/index.php?db=so&id=1283342 , о том что 0x08048000 это адрес по-умолчанию исполняемых файлов для загрузки.

Digan
() автор топика
Ответ на: комментарий от Digan

> 0x08048000 это адрес по-умолчанию исполняемых файлов для загрузки

А почему на этот адрес такие планы? Он-то может и изменён быть. Тогда вся логика накрывается известно чем.

one_more_hokum ★★★
()
Ответ на: комментарий от Digan

А ты проверь, скажем на x86-64. :)

Все гораздо проще. Смотришь смещение секции .text в файле, например readelf -S, колонка offset или читаешь сам. Смотришь таблицу символов, например readelf -s, колонка value или читаешь сам. Складываешь их, профит.

frey ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.