物語
私はシステムコール番号のリストを自動的に生成する C プログラムを持っています。適用可能な場合は、手書きの生成ファイルよりも現実世界の参照からの自動生成を好むからです。ターゲットは Ada パッケージです。一般的なシステムコールを含む従来の「Hello world」でテストを実行しましたが、write
失敗しました。システムコール番号が間違っていると思いました: 4 ではなく 64 です。
を含む C プログラムからリストを生成しました<asm-generic/unistd.h>
。プラットフォームは 32 ビットであり、64 ビット プラットフォームを対象とするツールチェーンはこれまでインストールされていません。
これからの定義の例unistd.h
: #define __NR_write 64
(べきである 4)、#define __NR_read 63
(べきである 3)、#define __NR_getuid 174
(べきである 24) など…</p>
すべてのファイルでテキスト検索を実行して、予想される定義の一部である/usr/**
出現を探しましたが、誰も見つかりませんでした。__NR_write
質問
このヘッダーが変なシステムコール番号を指定するのはなぜですか? 期待される定義がどこにも見つからないのはなぜですか? これは新しい ABI ですか?
注: プラットフォームは Ubuntu 12.04、32 ビットです。
アップデート
このコマンドを実行しているものを考えました:
find /usr/include/ -name "unistd*" -exec nano '{}' \;
/usr/include/i386-linux-gnu/asm/unistd_32.h
ヘッダーに適切な数値が含まれており、ヘッダーが から含まれていることを示しています/usr/include/i386-linux-gnu/asm/unistd.h
が、 が含まれている場合、シンボルの多くは定義されていません<asm/unistd.h>
。
更新 2
番号が違うだけでなく、名前もたくさんあります。元。__NR_socket
対__NR_socketcall
。説明の開始は可能な重複で与えられるかもしれません: arch/x86/include/asm/unistd.h 対 include/asm-generic/unistd.h。