Вопрос

I'm using a C library called GLC to record my OpenGL buffer programmatically. GLC listens to key presses, which is not really a nice solution to trigger programmatically.

Therefore I want to execute the recording from GLC via a function call in my software. My C++ software is linking to the library which includes the desired function start_capture(). Via nm I can see this function is local, marked with a lower case t.

Since it has to be global to access it in my software I want to recompile the library (which I've already done). But I have no idea what to change to make it accessible....

Here is the declaration from start_capture(), in the header file lib.h

...
__PRIVATE int start_capture(); // No idea where the __PRIVATE is coming from
...

This is the definition/implementation of the start_capture() function in the main.c:

int start_capture()
...
return ret;
}

And this is my dlopen to get the function:

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();

So what am I supposed to change to access this via the library file?

I hope this was enough description to make the problem clear. If not, I'll answer as fast as I can.

Это было полезно?

Решение

__PRIVATE is a #define for a GCC extension to hide a symbol. See https://github.com/nullkey/glc/blob/master/src/glc/common/glc.h#L60 for the definition and http://gcc.gnu.org/wiki/Visibility for more info about the GCC extension.

https://stackoverflow.com/a/12011284/2146478 provides a solution that will unhide symbols without recompiling. You would want to do something like:

$ objcopy --globalize-symbol=start_capture /path/to/your/lib.a /path/to/new/lib.a
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top