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

Исходное сообщение
"!!!!  Проблема вызова функций из динамической библиотеки "

Отправлено ForceMan , 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

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

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


Содержание

Сообщения в этом обсуждении
"!!!!  Проблема вызова функций из динамической библиотеки "
Отправлено СергейК , 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 создается


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

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