Использование libtool для загрузки дублированного имени функции из общей библиотеки
я пытаюсь создатьотладки» разделяемая библиотека (т.е. файл .so или .dll), которая вызывает другую 'реальный» разделяемая библиотека, которая имеет тот же C API, что и библиотека отладки (в данном случае для эмуляции API PKCS # 11). Однако я'Я сталкиваюсь с проблемой, когда карта ссылок библиотеки отладки сталкивается с картой реальной библиотеки и заставляет библиотеку отладки вызывать свои собственные функции вместо соответствующих функций в реальной библиотеке. Я нашел решение этой проблемы с помощью команды POSIX dlmopen, но хотел бы понять, возможно ли то же самое с помощью GNU 's libtool.
В моей системе Solaris 10 следующий код не проходит утверждение, когда тестовое приложение статически связывается с библиотекой отладки:
#include
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, то есть создать новую карту ссылок при загрузке новой библиотеки, чтобы она нене сталкиваются с картой ссылок библиотеки отладки?