web-dev-qa-db-ja.com

共有されたライブラリのnmシンボル出力t vs T

ユーザー空間の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を持っています。

22
ashish

私が間違っている可能性があることについて何か考えはありますか?

t関数は、実際にはライブラリに対してローカルです。これは、いくつかの理由により発生する可能性があります。最も可能性の高いものは次のとおりです。

  1. 関数staticを宣言した、または
  2. _-fvisibility=hidden_を使用してライブラリをコンパイルし、関数に__attribure__((visibility("default")))notしていない、または
  3. このライブラリを、明示的にエクスポートされたものを除くすべての関数を非表示にするリンカーバージョンスクリプト(つまり、_--version-script=libfoo.version_フラグを使用)にリンクし、関数をそのリストに追加しませんでした。

    シンボルの可視性を制限するために_--version-script_を使用する this の例を参照してください。
24