Необходимо динамически подгрузить библиотеку и вызвать функцию 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");
}
>Необходимо динамически подгрузить библиотеку и вызвать функцию test2()
>При попытке запуска вываливается с ошибкой сегментирования.
>
>-----------------main-mudule--------------> *(void **)(func1) = dlsym(handle, "_Z5test2v");
вот это что за конструкция?
func1 = dlsym(handle, "_Z5test2v");
ну а так вроде бы все.ну всякие там стилистические баги оставим. :) а так, "если все хорошо" работает.
>Необходимо динамически подгрузить библиотеку и вызвать функцию 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" {...}+ неискаженные имена функций. Ибо что будет при переходе на новую версию компилятора (когда возможно поменяются правила искажения имен функций)?
Спасибо огромное... проблемма решена...
А не могли бы Вы посоветовать мне, что почитать по теме extern "C" {}, а то я пока что слабо представляю себе "что это такое и с чем это едят".
>Спасибо огромное... проблемма решена...
>А не могли бы Вы посоветовать мне, что почитать по теме extern
>"C" {}, а то я пока что слабо представляю себе "что
>это такое и с чем это едят".
стандарт C++ :)