Для этого нет функции libc.Тем не менее, вы можете написать один самостоятельно (хотя код несколько сложен).
В Linux dlopen()
фактически возвращает адрес структуры link_map
, в которой есть член с именем l_addr
, который указываетна базовый адрес загруженного разделяемого объекта (при условии, что ваша система не рандомизирует размещение разделяемой библиотеки и что ваша библиотека не была предварительно связана).
В Linux - верный способ найти базовый адрес (адрес Elf*_Ehdr
) должен использовать dl_iterate_phdr()
после dlopen()
в библиотеке.
Имея заголовок ELF, вы должны иметь возможность перебирать список экспортируемых символов (таблица динамических символов),сначала найдите Elf*_Phdr
типа PT_DYNAMIC
, затем найдите элементы DT_SYMTAB
, DT_STRTAB
и выполните итерации по всем символам в таблице динамических символов.Для руководства используйте /usr/include/elf.h
.
Кроме того, вы можете использовать libelf , но я не могу вам помочь, поскольку у меня нет предыдущего опыта работы с ним.
Наконец, обратите внимание, что упражнение несколько бесполезно: вы получите список определенных функций, но вы не будете знать, как их вызывать (какие параметры они ожидают), так какой смысл?