The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
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++ :)




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру