dlfcn.h, neyromancer, 05-Июн-07, 13:46 [смотреть все]Необходимо динамически подгрузить библиотеку и вызвать функцию test2() При попытке запуска вываливается с ошибкой сегментирования.-----------------main-mudule-------------- #include "dlfcn.h" #include <stdio.h> #include <iostream> int main(int argc, char **argv) { void *handle; void (*func1)(); char *error; handle = dlopen ("./test_module.so", RTLD_NOW | RTLD_GLOBAL); if (!handle) fputs (dlerror(), stderr); *(void **)(func1) = dlsym(handle, "_Z5test2v"); if ((error = dlerror()) != NULL) fprintf (stderr, "%s\n", error); (*func1)(); dlclose(handle); } --------------------test_module---------------- #include <stdio.h> #include <iostream> void test2() { printf("testing"); } |
- dlfcn.h, NuINu, 14:51 , 05-Июн-07 (1)
>Необходимо динамически подгрузить библиотеку и вызвать функцию test2() >При попытке запуска вываливается с ошибкой сегментирования. > >-----------------main-mudule-------------- > *(void **)(func1) = dlsym(handle, "_Z5test2v"); вот это что за конструкция? func1 = dlsym(handle, "_Z5test2v"); ну а так вроде бы все. ну всякие там стилистические баги оставим. :) а так, "если все хорошо" работает.
- dlfcn.h, int _0dh, 16:32 , 05-Июн-07 (2)
>Необходимо динамически подгрузить библиотеку и вызвать функцию test2() >При попытке запуска вываливается с ошибкой сегментирования. > >-----------------main-mudule-------------- > >#include "dlfcn.h" >#include <stdio.h> >#include <iostream> >int main(int argc, char **argv) >{ > void *handle; > void (*func1)(); > char *error; > handle = dlopen ("./test_module.so", RTLD_NOW | RTLD_GLOBAL); > if (!handle) fputs (dlerror(), stderr); > *(void **)(func1) = dlsym(handle, "_Z5test2v"); > if ((error = dlerror()) != NULL) fprintf (stderr, "%s\n", error); > > (*func1)(); > dlclose(handle); >} > >--------------------test_module---------------- >#include <stdio.h> >#include <iostream> >void test2() >{ > printf("testing"); >} Дорогой друг! 1)Либо вы излишне невнимательны, либо не знаете C. *(void **)(func1) = ... - этот код попытается записать что-то по адресу который находится в func1 (а так как там никакого адреса нет, то естественно что приходит SIGSEGV). Правильно бы выглядела как func1 = (void (*)(void))dlsym(...).2) оставьте грязные привычки и используйте extern "C" {...}+ неискаженные имена функций. Ибо что будет при переходе на новую версию компилятора (когда возможно поменяются правила искажения имен функций)?
- dlfcn.h, neyromancer, 18:52 , 05-Июн-07 (3)
Спасибо огромное... проблемма решена... А не могли бы Вы посоветовать мне, что почитать по теме extern "C" {}, а то я пока что слабо представляю себе "что это такое и с чем это едят".
- dlfcn.h, int _0dh, 05:09 , 06-Июн-07 (4)
>Спасибо огромное... проблемма решена... >А не могли бы Вы посоветовать мне, что почитать по теме extern >"C" {}, а то я пока что слабо представляю себе "что >это такое и с чем это едят". стандарт C++ :)
|