ユーザー空間のFuseライブラリに新しい関数(Fuse_lowlevel_notify_inval_directory)を追加しました。 libfuse.soのコンパイルと作成はエラーなしで終了します。しかし、私のアプリケーションがこの新しい関数を使用しようとすると、リンカーはエラーをスローします。
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は、記号がテキストセクションに存在することを意味します。大文字の場合、シンボルはグローバル(外部)です。これが問題だと思います。新しく追加された関数は小文字のtを示していますが、他の古い関数は大文字のTを持っています。
私が間違っている可能性があることについて何か考えはありますか?
t
関数は、実際にはライブラリに対してローカルです。これは、いくつかの理由により発生する可能性があります。最も可能性の高いものは次のとおりです。
static
を宣言した、または-fvisibility=hidden
_を使用してライブラリをコンパイルし、関数に__attribure__((visibility("default")))
をnotしていない、または--version-script=libfoo.version
_フラグを使用)にリンクし、関数をそのリストに追加しませんでした。--version-script
_を使用する this の例を参照してください。