Как функция разрешения в файлах ELF узнает, в каких библиотеках находятся символы?

В таблице символов есть только смещение имени символа, но нет информации о том, к какой библиотеке принадлежит символ.


typedef struct {
Elf32_Word st_name;
Elf32_Addr st_value;
Elf32_Word st_size;
беззнаковый символ st_info; / * bind, введите: ELF_32_ST _... * /
беззнаковый символ st_other;
Elf32_Half st_shndx; / * ШН _... * /
} Elf32_Sym;

Когда разрешающая функция вызывается во время выполнения, ей передается смещение таблицы символов и другого DWORD. Имеет ли это DWORD какое-то отношение к символу lib? Если нет, то как разрешающая функция находит значение символа?

0

Решение

как разрешающая функция находит значение символа

Путем линейного поиска библиотек, загруженных в процесс (который поддерживает загрузчик).

Первая библиотека для определения данной функции «выигрывает». Это позволяет, например, libtcmalloc.so определить malloc, callocи т. д. и переопределить эти символы (вы либо используете LD_PRELOADили ссылка libtcmalloc до libc, так libtcmalloc появляется в списке загрузчиков раньше libc делает).

Поиск является линейным по количеству библиотек, но O(1) внутри каждой библиотеки, потому что каждая библиотека имеет хэш-таблицу своих символов (в .hash или же .gnu_hash раздел).

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]