Например:
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.
Для этого нет функции 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 , но я не могу вам помочь, поскольку у меня нет предыдущего опыта работы с ним.
Наконец, обратите внимание, что упражнение в некоторой степени бесполезно: вы получите список определенных функций, но не будете знать, как их вызывать (какие параметры они ожидают), так в чем же смысл?
{{ 1}}Я не думаю, что для этого есть опубликованный API. Вы можете использовать инструмент nm из binutils или изучить его исходный код: http://sourceware.org/cgi-bin/cvsweb.cgi/src/binutils/?cvsroot=src
(очевидно, при условии elf)
void *dlsym(void *restrict handle, const char *restrict name);
Возвращаемое значение
Если дескриптор не ссылается на действительный объект , открытый dlopen () , или если именованный символ не может быть найден в ни в одном из объектов, связанных с дескриптором , dlsym () вернет NULL . Более подробная диагностическая информация должна быть доступна через dlerror () .
(Источник: http://www.opengroup.org/onlinepubs/009695399/functions/dlsym.html )
Другими словами, если символ не найден, dlsym ()
вернет NULL
. Не уверен, что это то, что вы ищете, но это самый простой способ, который я могу найти.