The OpenNET Project / Index page

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

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

"!!!!  Проблема вызова функций из динамической библиотеки "  
Сообщение от ForceMan (ok) on 11-Май-06, 21:10 
Помогите, пож-та, исправить мой код для импорта функций из динамической библиотеки.

main.c:

#include <unistd.h>
  #include <errno.h>
  #include <dlfcn.h>

  int main(int argc, char * argv[])
  {
void    *handle;
int     *iptr, (*fptr)(int);

/* open the needed object */
handle = dlopen("/usr/home/igor/1/module1.so", RTLD_LOCAL | RTLD_LAZY);

/* find the address of function and data objects */
fptr = (int (*)(int))dlsym(handle, "my_function");

/* invoke function, passing value of integer as a parameter */
(*fptr)(22);

      return 0;
}


module1.c (собирается в module1.so) :
int my_function(int k)
{
    k++;
    return k;
}


##########g++ -g -o loader main.c

При запуске loader программа аварийно завершается: Segmentation Fault

Мои предположения, что причина - в некорректном приведении типов.

Жду ваших вариантов для разрешении этой проблемы.

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

 Оглавление

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


1. "!!!!  Проблема вызова функций из динамической библиотеки "  
Сообщение от СергейК email(??) on 12-Май-06, 00:43 
Все дело в том, что вы собираете все с помощью g++, а не gcc. А С++ компилятор изменяет (манглит) имена символов в библиотеках. Поэтому если посмотрите список символов в вашей module1.so, то увидите нечто вроде
[xxx@xxx tests 22:36:00]$ nm module1.so
00001388 A __bss_start
00001324 A _DYNAMIC
00001388 A _edata
00001388 A _end
0000137c A _GLOBAL_OFFSET_TABLE_
00000318 T _Z11my_functioni

т.е. символа my_function тут нету, а вместо него _Z11my_functioni
Так что выхода два -- либо собирайте все C, а не С++ компилятором, либо замените в вызове dlsym "my_function" на тот символ, который реально в module1.so создается

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

2. "!!!!  Проблема вызова функций из динамической библиотеки "  
Сообщение от DeadMustdie email(??) on 13-Май-06, 00:17 
>Так что выхода два -- либо собирайте все C, а не С++
>компилятором, либо замените в вызове dlsym "my_function" на тот символ, который
>реально в module1.so создается

'extern "C"' спасет.

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

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

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




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

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