2010-04-22 30 views
13

Per esempio:Tornando una libreria condivisa tabella dei simboli

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

Assumendo nessun errore, initializer punterà alla funzione SD_Init nella libreria condivisa libSDK.so.

Tuttavia, è necessario conoscere il simbolo "SDL_Init".

È possibile interrogare una libreria per tutti i suoi simboli? Ad esempio, in questo caso restituisce SDL_Init, il puntatore della funzione e qualsiasi altro simbolo esportato da libSDL.so.

risposta

14

Non esiste una funzione di libc di farlo. Tuttavia, puoi scriverne uno tu stesso (sebbene il codice sia in qualche modo coinvolto).

Su Linux, dlopen() infatti restituisce l'indirizzo di una struttura link_map, che ha un membro denominato l_addr che punta all'indirizzo di base dell'oggetto condiviso caricato (supponendo che il sistema non RANDOMIZE condiviso posizionamento biblioteca, e che il vostro la libreria non è stata prelinkata).

Su Linux, un modo sicuro per trovare l'indirizzo di base (l'indirizzo di Elf*_Ehdr) è utilizzare dl_iterate_phdr() dopo la dlopen() della libreria.

Avere l'intestazione ELF, si dovrebbe essere in grado di iterare su una lista di simboli esportati (tabella dei simboli dinamica), per prima cosa localizzare il Elf*_Phdr di tipo PT_DYNAMIC, e quindi localizzare DT_SYMTAB, DT_STRTAB voci, e l'iterazione di tutti i simboli nella tabella dei simboli dinamici. Utilizzare /usr/include/elf.h per guidare l'utente.

Inoltre, è possibile utilizzare libelf, ma non sono in grado di guidarti poiché non ho precedenti esperienze con esso.

Infine, notare che l'esercizio è in qualche modo inutile: si otterrà un elenco di funzioni definite, ma non si ha idea di come chiamarle (quali parametri si aspettano), quindi qual è il punto?

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

Return Value

Se maniglia non si riferisce a un oggetto valido aperto da dlopen(), o se il nome simbolo non può essere trovato all'interno qualsiasi gli oggetti associati a handle, dlsym() devono restituire NULLO. Ulteriori informazioni diagnostiche devono essere disponibili tramite dlerror().

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

In altre parole, se il simbolo non viene trovato, dlsym() tornerà NULL. Non sono sicuro che sia quello che stai cercando, ma questo è il modo più semplice che riesco a trovare.

+1

Sembra a me come il PO sta cercando di ottenere un elenco di simboli esportati dalla libreria. Che non penso sia possibile senza fare un po 'di analisi delle sezioni nella struttura ELF. –

-2

Il Linux nm comando potrebbe essere utilizzato: http://man.yolinux.com/cgi-bin/man2html?cgi_command=nm

+0

La domanda sembra essere alla ricerca di un mezzo programmatico per interrogare la tabella dei simboli di una libreria condivisa. 'nm' è un'utilità della riga di comando il cui formato di output del testo varia in base alla piattaforma. –

Problemi correlati