Использование libtool для загрузки дублированного имени функции из общей библиотеки - PullRequest
2 голосов
/ 11 ноября 2009

Я пытаюсь создать разделяемую библиотеку «отладка» (т. Е. Файл .so или .dll), которая вызывает другую «настоящую» разделяемую библиотеку с тем же C API, что и библиотека отладки (в данном случае, для эмуляции PKCS # 11 API). Однако я сталкиваюсь с проблемой, когда карта ссылок библиотеки отладки сталкивается с картой реальной библиотеки и заставляет библиотеку отладки вызывать свои собственные функции вместо соответствующих функций в реальной библиотеке. Я нашел решение этой проблемы с помощью команды POSIX dlmopen, но хотел бы понять, возможно ли то же самое с помощью libtool GNU.

В моей системе Solaris 10 следующий код не соответствует утверждению, когда тестовое приложение статически связывается с библиотекой отладки:

#include <dlfcn.h>
int MyFunctionName() {
  int (*function_ptr)();
  void *handle = dlopen("realsharedlibrary.so", RTDL_LAZY);
  *(void **)(&function_ptr) = dlsym(handle, "MyFunctionName");
  ASSERT(function_ptr != MyFunctionName); // Fails
  return (*function_ptr)();
}

В этом случае я получаю указатель функции на локальное «MyFunctionName» (в библиотеке отладки) вместо MyFunctionName в реальной общей библиотеке.

Я обнаружил, что можно обойти эту проблему, используя команду 'dlmopen' вместо 'dlopen' и сказав dlmopen, чтобы создать новую карту ссылок (с параметром LM_ID_NEWLM) при загрузке реальной библиотеки :

int MyFunctionName() {
  int (*function_ptr)();
  void *handle = dlmopen(LM_ID_NEWLM, "realsharedlibrary.so", RTDL_LAZY);
  *(void **)(&function_ptr) = dlsym(handle, "MyFunctionName");
  ASSERT(function_ptr != MyFunctionName); // succeeds
  return function_ptr(); // call real function
}

К сожалению, dlmopen, похоже, не включен в libtool (то есть я не вижу функции lt_dlmopen в libtool).

Можно ли сделать то же самое, используя команды libtool, то есть создать новую карту ссылок при загрузке новой библиотеки, чтобы она не сталкивалась с картой ссылок библиотеки отладки?

1 Ответ

1 голос
/ 03 декабря 2009

Я пока не нашел хорошего способа использовать libtool для решения этой проблемы, но есть способ избежать специфической для Solaris функции 'dlmopen', используя dlopen с этими флагами:

void *handle = dlopen("realsharedlibrary.so", RTLD_NOW | RTLD_GROUP | RTLD_LOCAL)

Очевидно, что проблема столкновений символов решается с помощью RTLD_NOW вместо RTLD_LAZY и добавлением RTLD_GROUP. RTLD_LOCAL есть, потому что POSIX требует использования RTLD_LOCAL или RTLD_GLOBAL, или поведение не определено. Для Solaris поведение по умолчанию равно RTLD_LOCAL.

Однако остается открытым вопрос, возможно ли передавать эти типы флагов в lt_dlopen.

...