Помогите, пож-та, исправить мой код для импорта функций из динамической библиотеки.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
Мои предположения, что причина - в некорректном приведении типов.
Жду ваших вариантов для разрешении этой проблемы.
Все дело в том, что вы собираете все с помощью 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, а не С++
>компилятором, либо замените в вызове dlsym "my_function" на тот символ, который
>реально в module1.so создается'extern "C"' спасет.