2010-04-22 17 views
13

Por ejemplo:Devolución de una biblioteca compartida tabla de símbolos

void* sdl_library = dlopen("libSDL.so", RTLD_LAZY); 
void* initializer = dlsym(sdl_library,"SDL_Init"); 

Suponiendo que no hay errores, inicializador apuntará a la SD_Init función en la biblioteca compartida libSDK.so.

Sin embargo, esto requiere saber que existe el símbolo "SDL_Init".

¿Es posible consultar una biblioteca con todos sus símbolos? Por ejemplo, en este caso devolvería SDL_Init, el puntero a la función y cualquier otro símbolo exportado por libSDL.so.

Respuesta

14

No hay función libc para hacer eso. Sin embargo, puede escribir uno usted mismo (aunque el código es algo complicado).

En Linux, de hecho dlopen() devuelve la dirección de una estructura link_map, que tiene un miembro denominado l_addr que apunta a la dirección base del objeto compartido cargado (suponiendo que su sistema no RANDOMIZE compartió la colocación de la biblioteca, y que su la biblioteca no ha sido pre-enlazada).

En Linux, una forma segura de encontrar la dirección base (la dirección de Elf*_Ehdr) es usar dl_iterate_phdr() después de dlopen() en la biblioteca.

Tener la cabecera ELF, debe ser capaz de iterar sobre una lista de símbolos exportados (la tabla de símbolos dinámica), por primera localizar el Elf*_Phdr de tipo PT_DYNAMIC, y luego localizar DT_SYMTAB, DT_STRTAB entradas, y iterar sobre todos los símbolos en la tabla de símbolos dinámicos Use /usr/include/elf.h para guiarlo.

Además, puede usar libelf, pero no puedo guiarlo ya que no tengo experiencia previa con él.

Finalmente, tenga en cuenta que el ejercicio es algo inútil: obtendrá una lista de funciones definidas, pero no tendrá idea de cómo llamarlas (qué parámetros esperan), entonces, ¿cuál es el punto?

-2
void *dlsym(void *restrict handle, const char *restrict name); 

Valor devuelto

Si mango no se refiere a un objeto válido abierto por dlopen(), o si el símbolo llamado no se encuentra dentro de cualquiera de los objetos asociados con mango, dlsym() devolverán NULO. Información de diagnóstico más detallada estará disponible a través de dlerror().

(Fuente: http://www.opengroup.org/onlinepubs/009695399/functions/dlsym.html)

En otras palabras, si no se encuentra el símbolo, dlsym() volverá NULL. No estoy seguro de si eso es lo que está buscando, pero esa es la forma más sencilla que puedo encontrar.

+1

Me suena como el PO está buscando para obtener una lista de símbolos exportados desde la biblioteca. Lo cual no creo que sea posible sin hacer algunos análisis de secciones en la estructura ELF. –

-2

El Linux comando nm podría utilizarse: http://man.yolinux.com/cgi-bin/man2html?cgi_command=nm

+0

La pregunta parece estar buscando un medio programático de consultar la tabla de símbolos de una biblioteca compartida. 'nm' es una utilidad de línea de comandos cuyo formato de salida de texto varía según la plataforma. –

Cuestiones relacionadas