2016-05-30 39 views
6

Ho aggiunto una nuova funzione (fuse_lowlevel_notify_inval_directory) nella libreria dei fusibili dello spazio utente. La compilazione e la creazione di libfuse.so sono terminate senza errori. Ma quando la mia applicazione tenta di utilizzare questa nuova funzione, il linker sta gettando errore: undefined reference to `fuse_lowlevel_notify_inval_directory' collect2: ld returned 1 exit status disimbolo nm in uscita t vs T in una libreria condivisa in modo

Quando ho controllato con nm

nm ../libfuse.so | grep inval 
00000000000154ed T fuse_invalidate 
**000000000001e142 t fuse_lowlevel_notify_inval_directory** 
000000000001e26c T fuse_lowlevel_notify_inval_entry 
000000000001e1cb T fuse_lowlevel_notify_inval_inode 

T/t significa che il simbolo è presente nella sezione di testo. se maiuscolo, il simbolo è globale (esterno). Sospetto che questo sia il problema. La nuova funzione aggiunta sta mostrando la lettera minuscola mentre altre funzioni più vecchie hanno la lettera maiuscola T. Qualche idea su cosa potrei fare male?

+0

Apparentemente non si è riusciti a fornire il collegamento esterno della funzione. È necessario che il codice, almeno, sia più utile. –

risposta

8

Any idea about what I might be doing wrong?

La funzione t è effettivamente locale alla libreria. Ciò potrebbe accadere a causa di un numero o di motivi. Le più probabili sono:

  1. È dichiarato la funzione static, o
  2. avete compilato biblioteca -fvisibility=hidden e ha fatto non hanno __attribure__((visibility("default"))) sulla funzione, o
  3. si è collegato questa libreria con un linker script di versione (ovvero con flag --version-script=libfoo.version) che nasconde tutte le funzioni, ad eccezione di quelle che vengono esportate in modo esplicito e non hai aggiunto la tua funzione a tale elenco.

    Vedere this esempio di utilizzo di --version-script per limitare la visibilità dei simboli.
+0

Il terzo punto era il problema. Il fusibile ha uno script di versione ed esporta esplicitamente le funzioni. – ashish