ioctlシステムコール用のユーザースペースラッパーがx86_64 Linux上でどこに定義されているのか不思議でした。私の最初の考えはglibcでした。インストールされたバージョンの公開されているシンボルをFedora 24ボックスでチェックしたところ、間違っていない限り、libcはioctlシンボルを 'W'という弱い記号で表していますデフォルト実装。 misc/ioctl.cのglibcソースツリーのデフォルト実装はスタブであるようですが、errnoにENOSYSを設定して-1を返します。x86_64 Linuxで定義されているioctlシステムコールのユーザー空間ラッパーはどこですか?
決して少なくても、ioctlは動作します(明らかに、私のシステムはあまり役に立たないでしょう)。私はおそらくアセンブラコードがアセンブルされ、何らかの形でリンクされているファイルのどこかにあると知っています。したがって、glibcによって公開されている弱いシンボルをオーバーライドします。また、アプリケーションがglibcのシステムコールを使って、またはアセンブリを使って直接、システムコールを使って直接ioctlを呼び出すことは完全に可能であることに気付いています。
しかし、ライブラリのソースコードを見ると(libdrm)標準のioctlヘッダー/usr/include/sys/ioctl.hが含まれていて、独自のラッパー実装がないようです私はどちらかを見ることができます、私はどこを見ているのだろうと思っています。
これは、GNU/Linuxシステムの最低レベルをより深く理解するための一環です。ありがとうございました。もしこれが以前に尋ねられたのであれば、どんな指針もお詫び申し上げます。ありがとうございました。
UPDATE:私は上記に言及することを怠ったが、私はまた、カーネルによってマップされた仮想VDSOライブラリを確認 - 私はそれだけでは、以下の見つけることができる:
0000000000000a00 W clock_gettime
0000000000000db0 W getcpu
0000000000000c40 W gettimeofday
0000000000000000 A LINUX_2.6
0000000000000d90 W time
0000000000000a00 T __vdso_clock_gettime
0000000000000db0 T __vdso_getcpu
0000000000000c40 T __vdso_gettimeofday
0000000000000d90 T __vdso_time
UPDATE:私がに関する誤ったと思われますglibcデフォルト定義はスタブです。コメントで指摘されていないので、逆アセンブリは実際のシステムコールを実行していることを示しています。私はこれを反映する答えを掲示しました。私の場合、私の元の質問にコメントで述べた番号として
lddとnmは私が使用しているツールです。つまり、nmを正しく使用していない可能性があります。このシンボルは、libcの弱いもの以外は見つけられません。 – PhilPotter1987
glibcのioctlのアセンブリ(例えば 'objdump -D/lib64/libc.so.6')を見ると、実際のシステムコールを実行することになります。これはmisc/ioctl.cの実装ではありません。その定義はglibcビルドプロセスの一部として自動生成される可能性があります。おそらくsysdeps/unix/make-syscalls.shがその一部です。 – nos
はい、あなたは正しいです - 私はこの質問に答えますが、あなたの名前を言及します。先端に感謝します。 – PhilPotter1987