The OpenNET Project / Index page

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

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"dlfcn.h"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"dlfcn.h"  
Сообщение от neyromancer email on 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");
}

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

 Оглавление

  • dlfcn.h, NuINu, 14:51 , 05-Июн-07, (1)  
  • dlfcn.h, int _0dh, 16:32 , 05-Июн-07, (2)  
    • dlfcn.h, neyromancer, 18:52 , 05-Июн-07, (3)  
      • dlfcn.h, int _0dh, 05:09 , 06-Июн-07, (4)  

Сообщения по теме [Сортировка по времени, UBB]


1. "dlfcn.h"  
Сообщение от NuINu (??) on 05-Июн-07, 14:51 
>Необходимо динамически подгрузить библиотеку и вызвать функцию test2()
>При попытке запуска вываливается с ошибкой сегментирования.
>
>-----------------main-mudule--------------

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "dlfcn.h"  
Сообщение от int _0dh on 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" {...}+ неискаженные имена функций. Ибо что будет при переходе на новую версию компилятора (когда возможно поменяются правила искажения имен функций)?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "dlfcn.h"  
Сообщение от neyromancer email on 05-Июн-07, 18:52 
Спасибо огромное... проблемма решена...
А не могли бы Вы посоветовать мне, что почитать по теме extern "C" {}, а то я пока что слабо представляю себе "что это такое и с чем это едят".
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




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

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