1

RHEL 5.5 サーバーで手動で squid をコンパイルしようとしたとき、実行configureして取得しました

configure: WARNING: Eep!  Cannot find epoll, kqueue, /dev/poll, poll or select!
configure: WARNING: Will try select and hope for the best.
configure: Using select for the IO loop.

カーネルが で構成されていないようCONFIG_EPOLLです。そこで、この epoll プログラムの例をコンパイルして、動作するかどうかを確認しようとしました。

私のgentooボックス(CONFIG_EPOLL有効になっています)では、問題なくコンパイルされています。

サーバー上で、私は

/tmp/cc8PhJh0.o: In function 'main':
epoll-exmaple.c:(.text+0x262): undefined reference to 'epoll_create1'
collect2: ld returned 1 exit status

C プログラム コンパイラが *.h ファイル内の定義を検索し、リンカがそれらを *.so ファイルとリンクすることは周知の事実です。

私の質問は、epoll_create1カーネルへのシステム コールです。そのシステム コールの実装を見つけるためにリンカが正確に検索するのはどのファイルですか?

ありがとう。

4

1 に答える 1

2

これは、システム C ライブラリを検索します (通常、少数のシステム コールは、librt などの他の特別なライブラリにあります)。C ライブラリは、システム コールの作成を処理するユーザー空間プログラム用の C API を提供します。場合によっては、これはシステム コールの周りの非常に薄いラッパーで、引数を設定して返すだけの場合もありますが、多くの場合、心配する必要のないさまざまな接着剤があります。ユーザー空間とカーネル、異なるアーキテクチャの実装の違い、カーネル システム コール API の変更に対する後方互換性または前方互換性など。

% readelf -s /lib/i386-linux-gnu/libc.so.6 | grep epoll_create1
  1837: 000d5280    52 FUNC    GLOBAL DEFAULT   12 epoll_create1@@GLIBC_2.9

上記のように C ライブラリを見ると、リンカがコードをリンクしている C 関数を見ることができます。

于 2013-03-18T07:16:53.010 に答える