2016-05-30 9 views
6

Ich habe eine neue Funktion (fuse_lowlevel_notify_inval_directory) in User Space Fuse-Bibliothek hinzugefügt. Die Kompilierung und Erstellung von libfuse.so ist ohne Fehler abgeschlossen. Aber wenn meine Anwendung diese neue Funktion zu nutzen versucht, wird der Linker-Fehler werfen: undefined reference to `fuse_lowlevel_notify_inval_directory‘ collect2: ld returned 1 exit statusnm Symbol Ausgabe t vs T in einer gemeinsamen so Bibliothek

Wenn ich mit nm

geprüft
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 bedeutet, dass das Symbol im Textabschnitt vorhanden ist. Wenn Großbuchstaben, ist das Symbol global (extern). Ich vermute, das ist das Problem. Die neue hinzugefügte Funktion zeigt Kleinbuchstaben t, während andere ältere Funktionen Großbuchstaben T haben. Irgendeine Idee darüber, was ich falsch machen könnte?

+0

Anscheinend haben Sie versäumt, Ihrer Funktion externe Verknüpfung zu geben. Brauchen Sie den Code, mindestens, um hilfreicher zu sein. –

Antwort

8

Any idea about what I might be doing wrong?

Die t Funktion ist in der Tat lokal für die Bibliothek. Dies kann aufgrund einer Reihe von Gründen geschehen. Die wahrscheinlichsten sind:

  1. Sie erklärt die Funktion static oder
  2. Sie die Bibliothek mit -fvisibility=hidden zusammengestellt und hat nicht haben __attribure__((visibility("default"))) auf die Funktion oder
  3. Sie verknüpft diese Bibliothek mit einem Linker Versions-Skript (dh mit --version-script=libfoo.version Flag), das alle Funktionen außer denen, die explizit exportiert werden, verbirgt, und Sie haben Ihre Funktion dieser Liste nicht hinzugefügt.

    Siehe this Beispiel für die Verwendung --version-script, um die Symbolsichtbarkeit zu begrenzen.
+0

Der dritte Punkt war das Problem. Fuse hat ein Versions-Skript und exportiert die Funktionen explizit. – ashish