В таблице символов есть только смещение имени символа, но нет информации о том, к какой библиотеке принадлежит символ.
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? Если нет, то как разрешающая функция находит значение символа?
как разрешающая функция находит значение символа
Путем линейного поиска библиотек, загруженных в процесс (который поддерживает загрузчик).
Первая библиотека для определения данной функции «выигрывает». Это позволяет, например, libtcmalloc.so
определить malloc
, calloc
и т. д. и переопределить эти символы (вы либо используете LD_PRELOAD
или ссылка libtcmalloc
до libc
, так libtcmalloc
появляется в списке загрузчиков раньше libc
делает).
Поиск является линейным по количеству библиотек, но O(1)
внутри каждой библиотеки, потому что каждая библиотека имеет хэш-таблицу своих символов (в .hash
или же .gnu_hash
раздел).
Других решений пока нет …