Возврат таблицы символов общей библиотеки - PullRequest
14 голосов
/ 23 апреля 2010

Например:

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.

Ответы [ 4 ]

15 голосов
/ 23 апреля 2010

Для этого нет функции 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 голос
/ 23 апреля 2010

Я не думаю, что есть опубликованный 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

(очевидно, предполагая elf)

0 голосов
/ 24 февраля 2015

Можно использовать команду linux nm : http://man.yolinux.com/cgi-bin/man2html?cgi_command=nm

0 голосов
/ 23 апреля 2010
void *dlsym(void *restrict handle, const char *restrict name);

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

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

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

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

...