Сделать локальную библиотечную функцию доступной глобально

Я использую библиотеку 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();

Так что я должен изменить, чтобы получить доступ к этому через файл библиотеки?

Надеюсь, этого описания было достаточно, чтобы прояснить проблему. Если нет, я отвечу так быстро, как смогу.

0

Решение

__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
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]