Подтвердить что ты не робот

Возврат таблицы символов разделяемой библиотеки

Например:

void* sdl_library = dlopen("libSDL.so", RTLD_LAZY);
void* initializer = dlsym(sdl_library,"SDL_Init");

Если не считать ошибок, инициализатор укажет на функцию SD_Init в общей библиотеке libSDK.so.

Однако для этого требуется знание символа "SDL_Init".

Возможно ли запросить библиотеку для всех ее символов? Например, в этом случае он вернет SDL_Init, указатель на функцию и любые другие символы, экспортированные libSDL.so.

4b9b3361

Ответ 1

Для этого нет функции 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, но я не могу вести вас, поскольку у меня нет предыдущего опыта с ним.

Наконец, обратите внимание, что упражнение несколько бесполезно: вы получите список определенных функций, но вы не знаете, как их называть (какие параметры они ожидают), так что точка?

Ответ 3

void *dlsym(void *restrict handle, const char *restrict name);

Возвращаемое значение

Если дескриптор не ссылается на действительный объект, открытый dlopen(), или если названный символ не может быть найден внутри любой из объектов, связанных с handle, dlsym() возвращает NULL. Более подробная диагностическая информация должны быть доступны через dlerror().

(Источник: http://www.opengroup.org/onlinepubs/009695399/functions/dlsym.html)

Другими словами, если символ не найден, dlsym() вернет NULL. Не уверен, что это то, что вы ищете, но это самый простой способ, который я могу найти.