
単一のシステムコールで特徴付けられる無意味なプログラムを書いているとしましょうopen
。
#include <fcntl.h>
void main()
{
int hi = open("does not exist", 0);
}
プログラムをコンパイルしてldd
出力に対してコマンドを実行すると、次の結果が表示されます。
linux-vdso.so.1 (0x00007ffddd741000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6835328000)
/lib64/ld-linux-x86-64.so.2 (0x00007f6835584000)
そのリンクだけが認識されlibc.so.6
、他のリンクは認識されません。
これらの他のライブラリの1つにカーネルシステムコールが含まれていますか?それとも、システムコール機能が静的に接続される可能性はありますか? (ありそうではありません)。
答え1
システムコールは関数として直接表示されず、関数のようにリンクされません。各アーキテクチャは、64ビットx86でシステムコールを呼び出す独自の方法を定義します。これには特定のCPU命令が含まれます。SYSCALL
。
Cライブラリはほとんどのシステムコールをサポートしています(そして一般的なシステムコール機能ラップされていないシステムコールの場合) プログラムはここに接続されます。