Я пытаюсь создать разделяемую библиотеку «отладка» (т. Е. Файл .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, то есть создать новую карту ссылок при загрузке новой библиотеки, чтобы она не сталкивалась с картой ссылок библиотеки отладки?