Программа Compile C помощью dlopen и dlsym с -fPIC

У меня возникли проблемы о неправильном разрешении символа. Моя главная программа загружает разделяемую библиотеку с 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 не помогает.

5
задан user377486 26 May 2012 в 10:07
поделиться