Как различать перемещаемые и неперемещаемые символы в разделе .data.rel

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

5
задан PeeHaa 12 January 2014 в 02:54
поделиться