Зачем нужен GOT?

Programs, sources, embedded, demomaking, whatsoever related to subj :)

Postby fk0 » 08 Mar 2014, 02:51

Зачем нужны GOT таблицы? Ведь в сегменте данных всё лежит уже в известном линкеру порядке, неизвестно только смещение. Почему бы в спец. регистре процессора хранить не адрес GOT-таблицы, а самого сегмента данных и относительно его начала и не адресовать бы? Код короче и быстрей. Я про переменные, GOT в связке с PLT для функций нужен, но это отдельная история.
* Origin: зип файл! (2:5030/1559)
User avatar
fk0
 
Posts: 1533
Joined: 07 Apr 2007, 01:08
Group: Registered users

Postby fk0 » 08 Mar 2014, 03:16

Догнал. Сегмент данных случае мешанины из библиотек распределён хаотичным образом. Без гота пришлось бы перед вызовом функции из конкретной библиотеки заново устанавливать базовый регистр на её кусок сегмента данных.

Но если хочется обратного. Сегмент данных, положим, линкером распределён на этапе компиляции и вообще не волнует. Хочется присутстия кода в сегменте кода по мере надобности. Потому, что адресное пространство маленькое и весь код разом не влезает. Т.е. PLT и GOT тут нужны. В готе не нужно ничего кроме функций. Идея в том, что если функция в памяти -- GOT содержит её адрес и она прямо практически вызывается. А если её нет в памяти, то гот содержит адрес загрузчика, который загрузит функцию (выкинув парочку других по мере надобности) и вызовет её, поместив в GOT её адрес.

Нет так не заработает. Если выкинуть из памяти функцию из которой вызвали данную (или более верхнюю в стеке), то куда потом возвращаться? Стало быть вызов через PLT где-то должен записывать функции, которые вызываются (в том же стеке) и при попытке выкинуть что-то из памяти нужно просматривать стек на предмет того, что функции сейчас заняты (вызвана и не вернулась: присутствует в стеке выше SP).

Callbacks тоже через PLT должны работать. Вроде всё сходится, должно работать? Не совсем понятно только, как заставить GCC нагенерить код с адресацией данных как есть, по абсолютным адресам, и с адресацией кода через PLT и GOT. И ещё чтоб в PLT враппер свой засунуть, которые в стеке односвязаный список вызванных функций поддерживать будет. :-/
* Origin: зип файл! (2:5030/1559)
User avatar
fk0
 
Posts: 1533
Joined: 07 Apr 2007, 01:08
Group: Registered users


Return to Coding

Who is online

Users browsing this forum: No registered users and 1 guest

cron