Господа может быть кто знает почему
функция 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 (*)()’
Я уже не знаю на что подумать и как правильно вызвать из библиотеки функцию.
Может кто ткнет где не так ?
Функция 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 (*)()’ А>> Я уже не знаю на что подумать и как правильно вызвать из библиотеки функцию. А>> Может кто ткнет где не так ?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Libra, Вы писали:
А> Конечно же я преобразовал к нужному типу А> demo_function = (simple_demo_function)dlsym(library_handler, "GetKeyPublic"); А> demo_function() ; А> demo_function — возвращает 0 А>как не верти.
Причем, перед непосредственным вызовом 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
Здравствуйте, Аноним, Вы писали:
А> dlerror() — говорит не могу найти вызываемую функцию А> Надо сказать что функция похоже находится внутри класса который в .SO
Значит, в dlsym() должно попадаться имя в том виде, в котором оно лежит в библиотеке для интерфейса, который ничего ни про какие классы не знает. Напустите на so'шник утилиту nm (с ключом -D и без него) и посмотрите, как выглядит имя.