Возврат таблицы символов разделяемой библиотеки
Например:
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.
Ответы
Ответ 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, но я не могу вести вас, поскольку у меня нет предыдущего опыта с ним.
Наконец, обратите внимание, что упражнение несколько бесполезно: вы получите список определенных функций, но вы не знаете, как их называть (какие параметры они ожидают), так что точка?
Ответ 2
Я не думаю, что для этого есть опубликованный API. Вы можете использовать инструмент nm из binutils или изучить его исходный код:
http://sourceware.org/cgi-bin/cvsweb.cgi/src/binutils/?cvsroot=src
http://sourceware.org/cgi-bin/cvsweb.cgi/src/binutils/nm.c?rev=1.63&content-type=text/x-cvsweb-markup&cvsroot=src
(очевидно, предполагая, что эльф)
Ответ 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
. Не уверен, что это то, что вы ищете, но это самый простой способ, который я могу найти.
Ответ 4
Можно использовать команду linux nm: http://man.yolinux.com/cgi-bin/man2html?cgi_command=nm