2

リンクに問題があります。read.cファイルで自分自身を定義したいlibfoo.so関数に依存する共有ライブラリに対してリンクする必要があります。read

すべてをコンパイルしてリンクしますが、実行時にエラーが発生します

/home/bar/src/libfoo.so: undefined symbol: sread.

nmは、シンボルが定義されていることを報告します

$nm baz | grep sread
  00000000000022f8 t sread

しかし、lddはシンボルが未定義であると報告します

$ldd -r baz | grep sread 
undefined symbol: sread (/home/bar/src/libfoo.so)

何が得られますか?libfoo.soが共有ライブラリであるという事実にいくつかの問題がありますか?

4

3 に答える 3

14

まず、「read」という関数を定義することは、すべてのUNIXenの標準libc関数であるため、悪い考え(TM)です。これを行うと、プログラムの動作は定義されません。

次に、でread定義した関数は、出力libbaz.soでマークされます。これは、この関数がローカルであることを意味します(外部には表示されません)。グローバル関数はでマークされています。't'nmlibbaz.so'T'nm

'static int read(...)'read.cで定義したときに使用しましたか?そうでない場合は、コンパイルしてリンクしたときに、リンカースクリプト、またはattribute((visibility(hidden)))、またはおそらく-fvisibility=hiddenコマンドラインを使用しましたlibbaz.soか?

于 2009-06-03T05:03:28.313 に答える
1

上記のエラーは、CコードがG ++でコンパイルされ、リンクされている場合にも発生する可能性があります。G ++は名前マングリングを実行するため、実際のシンボルは「_Zsds_ [function_name] _」のようになり、マングルされていない名前を検索するときにリンカーがチョークします。

ウィキペディアで概説されているアクションに従って問題が解決されたことを除いて、今日同じ動作に遭遇しました。基本的に、C ++コンパイラでコンパイルされたCコードでは、シンボルテーブルに「マングル」名が付けられ、Cスタイルのシンボル解決が失敗します。

于 2013-08-30T18:12:44.480 に答える
-1

共有ライブラリを構築するときは、同じライブラリまたは別の(共有)ライブラリ内の未定義のシンボルをすべて解決する必要があります。リンカは、ライブラリの未定義のシンボルをアプリケーションのシンボルで解決しません。

于 2009-06-03T03:10:38.623 に答える