2010-04-22 2 views
13

символов Например:Возвращение разделяемой библиотеки таблицы

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.

ответ

14

Там нет функции 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
void *dlsym(void *restrict handle, const char *restrict name); 

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

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

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

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

+1

Это звучит для меня как ОП ищу, чтобы получить список экспортируемых символов из библиотеки. Который я не думаю, что это возможно, не делая некоторого анализа секций в структуре ELF. –

1

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

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

-2

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

+0

Вопрос заключается в поиске программных средств запроса таблицы символов в общей библиотеке. 'nm' - это утилита командной строки, формат текста которой зависит от платформы. –