2016-12-20 5 views
6

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デフォルト定義はスタブです。コメントで指摘されていないので、逆アセンブリは実際のシステムコールを実行していることを示しています。私はこれを反映する答えを掲示しました。私の場合、私の元の質問にコメントで述べた番号として

+0

lddとnmは私が使用しているツールです。つまり、nmを正しく使用していない可能性があります。このシンボルは、libcの弱いもの以外は見つけられません。 – PhilPotter1987

+2

glibcのioctlのアセンブリ(例えば 'objdump -D/lib64/libc.so.6')を見ると、実際のシステムコールを実行することになります。これはmisc/ioctl.cの実装ではありません。その定義はglibcビルドプロセスの一部として自動生成される可能性があります。おそらくsysdeps/unix/make-syscalls.shがその一部です。 – nos

+0

はい、あなたは正しいです - 私はこの質問に答えますが、あなたの名前を言及します。先端に感謝します。 – PhilPotter1987

答えて

0

、それは確かに実際にlibcの中で定義され、次のように:

00000000000f8ce0 <ioctl>: 
    f8ce0:  b8 10 00 00 00   mov $0x10,%eax 
    f8ce5:  0f 05     syscall 
    f8ce7:  48 3d 01 f0 ff ff  cmp $0xfffffffffffff001,%rax 
    f8ced:  73 01     jae f8cf0 <ioctl+0x10> 
    f8cef:  c3      retq 
    f8cf0:  48 8b 0d 71 31 2c 00 mov 0x2c3171(%rip),%rcx  # 3bbe68 <_DYNAMIC+0x308> 
    f8cf7:  f7 d8     neg %eax 
    f8cf9:  64 89 01    mov %eax,%fs:(%rcx) 
    f8cfc:  48 83 c8 ff    or  $0xffffffffffffffff,%rax 
    f8d00:  c3      retq 
    f8d01:  66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 
    f8d08:  00 00 00 
    f8d0b:  0f 1f 44 00 00   nopl 0x0(%rax,%rax,1) 

これは明らかに、ここでシステムコールをしている - 番号が言うように、それは私はglibcのソースツリーでそれをすぐに見つけることができなかったのです。

関連する問題