Linux dlsym ?
От: Аноним  
Дата: 25.12.08 11:05
Оценка:
Господа может быть кто знает почему
функция dlsym возвращает 0x0
при вызове из .so функции ?
И к томуже ругается на применение типа который везде описан .
Конкретнее :
я делаю library_handler = dlopen("libRSA_prot.so",RTLD_LOCAL | RTLD_LAZY);
и получаю нормальный Хендл .
но в последствии я пытаюсь получить ссылку на функцию из библиотеки libRSA_prot.so
следующим образом
typedef void (*simple_function)(void);
simple_function _function;
_function = dlsym(library_handler, "GetKeyPublic");
(*demo_function)() ; // пытаюсь запустить функцию на выполнение

при компиляции мне выдается ошибка подобного типа
main.cpp:30: ошибка: некорректное преобразование из ‘void*’ в ‘void (*)()’
Я уже не знаю на что подумать и как правильно вызвать из библиотеки функцию.
Может кто ткнет где не так ?
Re: Linux dlsym ?
От: Libra Россия  
Дата: 25.12.08 12:02
Оценка:
Здравствуйте, Аноним, Вы писали:

Функция dlsym возвращает указатель типа void*. Несоответствие типов налицо.
Тут необходимо преобразование к нужному типу.

А>Господа может быть кто знает почему

А> функция dlsym возвращает 0x0
А> при вызове из .so функции ?
А> И к томуже ругается на применение типа который везде описан .
А> Конкретнее :
А> я делаю library_handler = dlopen("libRSA_prot.so",RTLD_LOCAL | RTLD_LAZY);
А> и получаю нормальный Хендл .
А> но в последствии я пытаюсь получить ссылку на функцию из библиотеки libRSA_prot.so
А> следующим образом
А> typedef void (*simple_function)(void);
А> simple_function _function;
А> _function = simple_function(dlsym(library_handler, "GetKeyPublic"));
А> (*demo_function)() ; // пытаюсь запустить функцию на выполнение

А> при компиляции мне выдается ошибка подобного типа

А> main.cpp:30: ошибка: некорректное преобразование из ‘void*’ в ‘void (*)()’
А> Я уже не знаю на что подумать и как правильно вызвать из библиотеки функцию.
А> Может кто ткнет где не так ?
Species come and go, but the earth stands forever fast...
Re[2]: Linux dlsym ?
От: Аноним  
Дата: 25.12.08 13:37
Оценка:
Здравствуйте, Libra, Вы писали:

Конечно же я преобразовал к нужному типу
demo_function = (simple_demo_function)dlsym(library_handler, "GetKeyPublic");
demo_function() ;
demo_function — возвращает 0
как не верти.

L>Здравствуйте, Аноним, Вы писали:



L>Функция dlsym возвращает указатель типа void*. Несоответствие типов налицо.

L>Тут необходимо преобразование к нужному типу.

А>>Господа может быть кто знает почему

А>> функция dlsym возвращает 0x0
А>> при вызове из .so функции ?
А>> И к томуже ругается на применение типа который везде описан .
А>> Конкретнее :
А>> я делаю library_handler = dlopen("libRSA_prot.so",RTLD_LOCAL | RTLD_LAZY);
А>> и получаю нормальный Хендл .
А>> но в последствии я пытаюсь получить ссылку на функцию из библиотеки libRSA_prot.so
А>> следующим образом
А>> typedef void (*simple_function)(void);
А>> simple_function _function;
L>А> _function = simple_function(dlsym(library_handler, "GetKeyPublic"));
А>> (*demo_function)() ; // пытаюсь запустить функцию на выполнение

А>> при компиляции мне выдается ошибка подобного типа

А>> main.cpp:30: ошибка: некорректное преобразование из ‘void*’ в ‘void (*)()’
А>> Я уже не знаю на что подумать и как правильно вызвать из библиотеки функцию.
А>> Может кто ткнет где не так ?
Re[3]: Linux dlsym ?
От: neFormal Россия  
Дата: 25.12.08 13:47
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Libra, Вы писали:


А> Конечно же я преобразовал к нужному типу

А> demo_function = (simple_demo_function)dlsym(library_handler, "GetKeyPublic");
А> demo_function() ;
А> demo_function — возвращает 0
А>как не верти.

а говорит что нибудь?.
const char* err = dlerror();
...coding for chaos...
Re[4]: Linux dlsym ?
От: Libra Россия  
Дата: 25.12.08 14:10
Оценка:
Причем, перед непосредственным вызовом dlsym, так же неплохо было бы вызвать dlerror (ибо так написано в священном писании, см. 'man dlsym').
Другими словами пишем нечто вот такое:
// ...
typedef void (*some_function_pointer)();
// ... load library, etc.
// clear any old error conditions
dlerror();
// get symbol address
some_function_pointer func = some_function_pointer(dlsym(lib_handle, "some_function"));
// check error conditions...
char const* etext = dlerror();
if(etext)
{
  // ... do something special...
}
// ... continue ...

Удачи.
Species come and go, but the earth stands forever fast...
Re[5]: Linux dlsym ?
От: Аноним  
Дата: 26.12.08 09:01
Оценка:
Здравствуйте, Libra, Вы писали:


L>Причем, перед непосредственным вызовом dlsym, так же неплохо было бы вызвать dlerror (ибо так написано в священном писании, см. 'man dlsym').

L>Другими словами пишем нечто вот такое:
L>
L>// ...
L>typedef void (*some_function_pointer)();
L>// ... load library, etc.
L>// clear any old error conditions
L>dlerror();
L>// get symbol address
L>some_function_pointer func = some_function_pointer(dlsym(lib_handle, "some_function"));
L>// check error conditions...
L>char const* etext = dlerror();
L>if(etext)
L>{
L>  // ... do something special...
L>}
L>// ... continue ...
L>

L>Удачи.

dlerror() — говорит не могу найти вызываемую функцию
Надо сказать что функция похоже находится внутри класса который в .SO
Re[6]: Linux dlsym ?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 28.12.08 22:15
Оценка:
Здравствуйте, Аноним, Вы писали:

А> dlerror() — говорит не могу найти вызываемую функцию

А> Надо сказать что функция похоже находится внутри класса который в .SO

Значит, в dlsym() должно попадаться имя в том виде, в котором оно лежит в библиотеке для интерфейса, который ничего ни про какие классы не знает. Напустите на so'шник утилиту nm (с ключом -D и без него) и посмотрите, как выглядит имя.
The God is real, unless declared integer.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.