Я пытаюсь создать простой компоновщик для 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
?