2010-02-16 6 views
30

Ho appena creato una lib condivisa su Ubuntu, e quando tento di usare la funzione, l'applicazione che carica la libreria riporta il simbolo "xxx" non trovato.Come elencare le funzioni esportate in una lib condivisa su Ubuntu

Desidero controllare (ad esempio elenco) le funzioni esportate dalla mia libreria in modo da poter esaminare ulteriormente il problema.

dettagli rilevanti:

OS: Ubuntu 9.10 compilatore gcc 4.4.1 linker: GNU ld 2,20

risposta

26

Prova l'utilità nm.

GNU nm elenca i simboli oggetto file objfile .... Se nessun file oggetto sono elencati come argomenti, assume nm il file a.out. [reference]

+15

** nm -C --defined-only -g libXXX.so ** per C++ –

+0

Grazie per quello. Sembra che il mio simbolo sia esportato, ma non definito (ha una "U" accanto al nome della funzione). Come può una funzione essere esportata e tuttavia non definita (IIRC, un'opzione linker impedisce questo tipo di assurdità). Ancora più importante, cosa posso fare per risolverlo? –

+0

Con "Correzione", voglio dire come posso garantire che le mie funzioni vengano esportate e DEFINITE nella libreria condivisa? –

2

La libreria condivisa è nel percorso di caricamento della libreria o nel percorso di ricerca di runtime dell'applicazione? Sembra che il linker dinamico non riesca a trovare la tua libreria. Prova a eseguire ldd nell'applicazione per vedere se è possibile trovare la libreria in fase di esecuzione, ad es.:

$ ldd /usr/bin/less 
    linux-gate.so.1 => (0x0072a000) 
    libncurses.so.5 => /lib/libncurses.so.5 (0x00c68000) 
    libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x007c7000) 
    libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0x00286000) 
    /lib/ld-linux.so.2 (0x002a1000) 

vedere la pagina ld.so(8) man per ulteriori dettagli su percorsi di ricerca delle biblioteche.

19
nm -D -C -g <library> 

funziona bene.

+1

Per le funzioni _exported_ aggiungere l'opzione '--defined-only', altrimenti in questo modo si otterranno anche le importazioni. Inoltre, per ottenere solo _functions_ e non ad es. qualcosa come '_edata', dovresti cercare i simboli con' T' o 't' nella seconda colonna. Quindi, qualcosa del genere: 'nm -DCg - solo $ MY_LIB definito | grep '^ [0-9a-f] \ + [Tt]' ' – Ruslan