2017-12-07 7 views
0

ソケット関数を使用して簡単なサーバープログラムを作成しました。 g++でコンパイルすると、send、__ xnet_socket、listen、accept、__ xnet_bindのシンボルが定義されていません。g ++でコンパイルすると、dlsym()を使用してsocket()とbind()がインターセプトされません。

なぜソケットとバインドのシンボルが他と異なるのですか? また、gccを使用してプログラムをコンパイルすると、この 'xnet'の違いは発生しません。 libsocket.soとリンクすると、このリンクエラーが発生します。

実際には、これらのソケットAPIをオーバーロードし、dlsym()を使用してそれらを傍受する共有ライブラリを作成しています。 Solarisでこのライブラリをgccでコンパイルすると、これらの呼び出しはライブラリを経由しますが、g++でコンパイルすると、socket()bind()呼び出しは傍受されませんが、他のすべてのapisはライブラリを経由します。

libxnet.soこれを行うには? dtraceに何か助けてもらえますか?

+1

* g ++でコンパイルすると、send、__xnet_socket、listen、accept、__xnet_bindの定義されていないシンボルエラーが発生します。* '-lxnet'とリンクしていないようです。リンクコマンド[s]を投稿してください。 –

答えて

0

リンカがこれらの機能を実行するには、libsocket(-lsocket経由)とリンクする必要があります。 libxnetは11.3のフィルタライブラリです。関数はlibxnetからlibsocket、libnsl、libcに移されました。

SolarisでOSSを構築するときに、LDLIBSに-lsocket -lnslを追加すると、一般的に簡単に設定とビルドの段階がわかりました。リンカは、出力から不要な参照を削除するほどスマートです。

関連する問題