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