Как получить абсолютное имя файла библиотеки, соответствующее относительному пути, указанному для dlopen?

В моей программе есть такой код

/* libname may be a relative path */
void loadLib(char const *libname) {
   void *handle = dlopen(libname);
   /* ... */
   dlclose(handle);
}

В / * .. * / мне нужно прочитать файл карты памяти / proc / self / maps , чтобы найти адрес виртуальной памяти, по которому отображается имя библиотеки , и мне также нужно открыть библиотеку, чтобы найти в ней определенные разделы. Для этого мне нужно абсолютное имя, которое dlopen найдено путем поиска в различных местах (например, в файле кэша ldconfig ). Как я могу получить это имя файла?


Это то, что я в итоге получил ( да, это код C ++, тем не менее тег C имеет смысл для этого вопроса, потому что dlopen используется с и C ++, и C, и мой вопрос подходит для обоих, и POSIX определяет его для C. ).

   boost::shared_ptr<void> dl;
   if(void *handle = dlopen(libfile, RTLD_LAZY)) {
      dl.reset(handle, &dlclose);
   } else {
      printdlerr();
      return -1;
   }

   /* update sofile to be an absolute file name */
   {
      struct link_map *map;
          dlinfo(dl.get(), RTLD_DI_LINKMAP, &map);
      if(!map) {
         return -1;
      }
      char *real = realpath(map->l_name, NULL);
      if(!real)
         return -1;
      sofile.reset(real, &free);
   }

libfile - это относительное / простое имя файла. Карта даст не простое имя файла (т.е. не foo.so , но может быть ./ foo.so ). Впоследствии я использовал realpath , чтобы получить окончательное имя абсолютного пути. Работает отлично!

11
задан Mogsdad 11 September 2015 в 18:35
поделиться