URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 6520
[ Назад ]

Исходное сообщение
"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 , 05-Июн-07 14:51 
>Необходимо динамически подгрузить библиотеку и вызвать функцию test2()
>При попытке запуска вываливается с ошибкой сегментирования.
>
>-----------------main-mudule--------------

> *(void **)(func1) = dlsym(handle, "_Z5test2v");
вот это что за конструкция?
func1 = dlsym(handle, "_Z5test2v");
ну а так вроде бы все.

ну всякие там стилистические баги оставим. :) а так, "если все хорошо" работает.


"dlfcn.h"
Отправлено int _0dh , 05-Июн-07 16:32 
>Необходимо динамически подгрузить библиотеку и вызвать функцию 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 , 05-Июн-07 18:52 
Спасибо огромное... проблемма решена...
А не могли бы Вы посоветовать мне, что почитать по теме extern "C" {}, а то я пока что слабо представляю себе "что это такое и с чем это едят".

"dlfcn.h"
Отправлено int _0dh , 06-Июн-07 05:09 
>Спасибо огромное... проблемма решена...
>А не могли бы Вы посоветовать мне, что почитать по теме extern
>"C" {}, а то я пока что слабо представляю себе "что
>это такое и с чем это едят".
стандарт C++ :)