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

Например:

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.

15
задан joemoe 22 April 2010 в 20:38
поделиться

3 ответа

Для этого нет функции 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}}
15
ответ дан 1 December 2019 в 04:52
поделиться

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

1
ответ дан 1 December 2019 в 04:52
поделиться
void *dlsym(void *restrict handle, const char *restrict name);

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

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

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

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

-3
ответ дан 1 December 2019 в 04:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: