У меня возникли проблемы о неправильном разрешении символа. Моя главная программа загружает разделяемую библиотеку с dlopen и символ из него с dlsym. Обе программы и библиотеки написаны на C. Библиотека кода
int a(int b)
{
return b+1;
}
int c(int d)
{
return a(d)+1;
}
Для того, чтобы заставить его работать на 64-битной машине, -fPIC передается НКУ при компиляции.
Программа:
#include <dlfcn.h>
#include <stdio.h>
int (*a)(int b);
int (*c)(int d);
int main()
{
void* lib=dlopen("./libtest.so",RTLD_LAZY);
a=dlsym(lib,"a");
c=dlsym(lib,"c");
int d = c(6);
int b = a(5);
printf("b is %d d is %d\n",b,d);
return 0;
}
Все работает нормально, если программа не компилируется с -fPIC, но она падает с ошибкой сегментации, когда программа составлена с -fPIC. Исследование привело к обнаружить, что авария связана с неправильным разрешением символа а. Катастрофа происходит, когда не называется, независимо от того, является ли из библиотеки или основной программы (это последний получил закомментировав линию, призывающую с () в основной программе).
Проблемы не возникают при вызове с () сам, вероятно, потому, что с () не вызывается внутри самой библиотеки, в то время как () является как функция используется внутри библиотеки и функции API библиотеки.
Простое решение не использовать -fPIC при составлении программы. Но это не всегда возможно, например, когда код основной программы должен быть в самой общей библиотеке. Другим решением является переименование указатель на функцию а к чему-то еще. Но я не могу найти реальное решение.
Замена RTLD_LAZY с RTLD_NOW не помогает.