В моей программе есть такой код
/* 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
, чтобы получить окончательное имя абсолютного пути. Работает отлично!