LINUX.ORG.RU

_GLOBAL_OFFSET_TABLE_


0

0

необходимо получить адрес сабжа в функции инициализации динамической библиотеки

код

extern unsigned long _GLOBAL_OFFSET_TABLE_[];
void init(void) {
    void * ptr = _GLOBAL_OFFSET_TABLE_;
}

не работает, потому как компилятор генерирует релокацию GOTPCREL для сабжа, т. е ищет адрес GOT в самой GOT

Ответ на: комментарий от anonymous

через LD_PRELOAD загружается библиотека, в функции инициализации которой сабжевый код
необходимо определить адрес _DYNAMIC секции исполняемого файла к которому применяется LD_PRELOAD 
из GOT библиотеки можно найти адрес структуры link_map, которая описывает эту библиотеку
через нее найти link_map для исполняемого файла
в структуре через l_ld получить адрес _DYNAMIC

вся эта шняга нужна для замены вызовов библиотечных функций из исполняемого файла на вызовы функций из библиотеки (путем изменения элементов GOT PLT исполняемого файла)

rei3er
() автор топика
Ответ на: комментарий от rei3er

>вся эта шняга нужна для замены вызовов библиотечных функций из исполняемого файла на вызовы функций из библиотеки

Для этого и нужен LD_PRELOAD, не надо велосипедов. Если нужно просто "заменить вызов библиотечных функций из исполняемого файла на вызовы функций из библиотеки", то просто грузите это библиотеку в LD_PRELOAD, предварительно переопределив в ней функции

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.