Как различить перемещаемые и не перемещаемые символы в разделе .data.rel - PullRequest
5 голосов
/ 09 марта 2012

Я пытаюсь создать простой компоновщик для barebone-приложения ARM.В настоящее время загрузчик, который загружает модуль, просто добавляет смещение ко всем записям внутри секций .got и .data.rel.Это прекрасно работает в .got и для всех символов, которые нужно переместить в .data.rel.Это сломается для всех не перемещаемых данных, поскольку те получат это смещение также.

Пример:

void some_function() { return; }

struct a {
    void* fptr;
    int number;
};

static struct a = {
   .fptr = some_function,
   .number = 0x1000,
};

Здесь a.fptr будет правильно указывать фактическое местоположение функции, но a.number будет некорректно удерживать 0x1000 + offset вместо просто 0x1000.

Как я должен различать два?Достаточно ли того, что я проверяю раздел .symtab и перемещаю только те адреса, которые там находятся?Но что, если символ на самом деле находится в местоположении 0x1000?Или компоновщик решает эту проблему (поэтому он не будет помещать функцию по адресу 0x1000)?Содержит ли .symtabs в действительности все символы, которые можно найти внутри .got и .data.rel?

1 Ответ

3 голосов
/ 11 марта 2012

Некоторое время назад я написал базовый загрузчик ELF, и я напоминаю, что вы только добавляете смещения к записям перемещения, помеченным как "R_ARM_ABS32".

Вы можете найти код здесь https://github.com/tangrs/ndless-elfloader/blob/master/elf/elf_load.c

Я просто связал свои файлы ELF с включенным параметром --emit-relocs. Таким образом, линкер выполняет всю связь, он просто сообщает мне, что он сделал, чтобы вы могли исправить смещения во время загрузки.

...