En mi programa tengo código como el siguiente¿Cómo obtener el nombre del archivo de la biblioteca absoluta correspondiente a una ruta relativa dada a dlopen?
/* libname may be a relative path */
void loadLib(char const *libname) {
void *handle = dlopen(libname);
/* ... */
dlclose(handle);
}
Dentro /* .. */
, necesito leer el archivo de mapa de memoria /proc/self/maps
, para encontrar la dirección de memoria virtual en el que libname
se correlaciona con, y también necesito para abrir el biblioteca para encontrar ciertas secciones en ella. Para esto, necesito el nombre absoluto que encontró dlopen
al buscar en varios lugares (como, en el archivo de caché ldconfig
). ¿Cómo puedo recibir ese nombre de archivo?
Esto es lo que finalmente terminó con (sí, este es el código C++, sin embargo, la etiqueta C tiene sentido para esta pregunta porque dlopen
se utiliza tanto con C++ y C, y mi pregunta es elegible para ambos y POSIX lo especifica para 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
es el nombre de archivo relativo/plain. El mapa producirá un nombre de archivo no simple (es decir, no foo.so
pero puede ser ./foo.so
). Después utilicé realpath
para obtener el nombre de ruta absoluta final. ¡Funciona bien!
gracias. Lo hice y funciona. Mostraré mi camino final pronto. –