Я использую библиотеку C под названием GLC для программной записи моего буфера OpenGL.
GLC слушает нажатия клавиш, что на самом деле не является хорошим решением для программного запуска.
Поэтому я хочу выполнить запись из GLC через вызов функции в моем программном обеспечении.
My C ++ software ссылается на библиотеку, которая включает в себя нужную функцию start_capture()
, Через нм я вижу, что эта функция является локальной, отмечена строчной буквой t.
Поскольку он должен быть глобальным для доступа к нему в моем программном обеспечении, я хочу перекомпилировать библиотеку (что я уже сделал). Но я понятия не имею, что изменить, чтобы сделать его доступным ….
Вот декларация от start_capture()
в заголовочном файле lib.h
...
__PRIVATE int start_capture(); // No idea where the __PRIVATE is coming from
...
Это определение / реализация start_capture()
функция в main.c:
int start_capture()
...
return ret;
}
И это мой dlopen, чтобы получить функцию:
void *handle_so;
void (*start_capture_custom)();
char *error_so;
handle_so = dlopen("/home/jrick/fuerte_workspace/sandbox/Bag2Film/helper/libglc-hook.so", RTLD_LAZY);
if (!handle_so)
{
fprintf(stderr, "%s\n", dlerror());
exit(1);
}
dlerror(); /* Clear any existing error */
start_capture_custom = (void (*)())dlsym(handle_so, "start_capture");
if ((error_so = dlerror()) != NULL)
{
fprintf(stderr, "%s\n", error_so);
exit(1);
}
start_capture_custom();
dlclose(handle_so);
start_capture();
Так что я должен изменить, чтобы получить доступ к этому через файл библиотеки?
Надеюсь, этого описания было достаточно, чтобы прояснить проблему. Если нет, я отвечу так быстро, как смогу.
__PRIVATE
это #define
для расширения GCC, чтобы скрыть символ. Увидеть https://github.com/nullkey/glc/blob/master/src/glc/common/glc.h#L60 для определения и http://gcc.gnu.org/wiki/Visibility Для получения дополнительной информации о расширении GCC.
https://stackoverflow.com/a/12011284/2146478 предоставляет решение, которое будет отображать символы без перекомпиляции. Вы хотели бы сделать что-то вроде:
$ objcopy --globalize-symbol=start_capture /path/to/your/lib.a /path/to/new/lib.a
Других решений пока нет …