открытие библиотеки, которая имеет зависимости

У меня есть программа, которая вызывает dlopen (с RTLD_NOW) для динамической загрузки библиотеки, полный путь которой указан во время выполнения, но неизвестен при первом запуске программы. Указанная библиотека была динамически связана с ДРУГИМ файлом .so, местонахождение которого также неизвестно до запуска программы, но известно до вызова dlopen. Любые мысли о том, как я могу заставить этот сценарий работать? Спасибо!


person tommy-tunes    schedule 27.05.2013    source источник


Ответы (1)


Передайте его методу в первой динамически загружаемой библиотеке

три.с:

#include <stdio.h>

void
doit()
{
   printf("Success\n");
}

два.с:

#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>

void go(const char* location)
{
   void *handle;
   void (*doit)(void);
   char *error;

   handle = dlopen(location, RTLD_LAZY);
   if (!handle) {
      fprintf(stderr, "%s\n", dlerror());
      exit(EXIT_FAILURE);
   }

   dlerror();

   *(void **) (&doit) = dlsym(handle, "doit");

   if ((error = dlerror()) != NULL)  {
      fprintf(stderr, "%s\n", error);
      exit(EXIT_FAILURE);
   }

   (*doit)();
   dlclose(handle);
}

основной.с:

#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>

int
main(int argc, char **argv)
{
   void *handle;
   void (*go)(const char*);
   char *error;

   handle = dlopen("/tmp/two.so", RTLD_NOW);
   if (!handle) {
      fprintf(stderr, "%s\n", dlerror());
      return EXIT_FAILURE;
   }

   dlerror();

   const char* location = "/tmp/three.so";
   *(void **) (&go) = dlsym(handle, "go");

   if ((error = dlerror()) != NULL)  {
      fprintf(stderr, "%s\n", error);
      return EXIT_FAILURE;
   }

   (*go)(location);
   dlclose(handle);

   return EXIT_SUCCESS;
}

Полученные результаты:

svengali ~ % gcc -o /tmp/two.so two.c -shared -rdynamic -fpic
svengali ~ % gcc -o /tmp/three.so three.c -shared -rdynamic -fpic
svengali ~ % gcc -rdynamic -o go main.c -ldl
svengali ~ % go
Success
svengali ~ % 
person JRG    schedule 27.05.2013