2011-06-29 7 views
20

私はLinuxのglibcのソースを調べていましたが、実際に何が行われているのかわかりません。以下はio/chdir.cのものですが、ソースファイルの多くを示しています。何が起きてる?明らかに私は何かが足りない。秘密は何ですか、それはシステムコールをするか、実際に何かをしますか?ここで、syscallsはglibcのソースにあります

stub_warningは、いくつかのレガシークレイジーです。 __set_errnoは、errnoを設定する単純なマクロのようです。そして、私が百万人の使用を見つけている間に、私はそれがどこにでも定義されているのを見ません。weak_alias

glibcがどのように動作するかを理解するのに役立つガイドがありますか?

#include <errno.h> 
#include <stddef.h> 
#include <unistd.h> 

/* Change the current directory to PATH. */ 
int 
__chdir (path) 
    const char *path; 
{ 
    if (path == NULL) 
    { 
     __set_errno (EINVAL); 
     return -1; 
    } 

    __set_errno (ENOSYS); 
    return -1; 
} 
stub_warning (chdir) 

weak_alias (__chdir, chdir) 
#include <stub-tag.h> 
+0

よろしくお願いいたします。この玉ねぎには、私が予想していたよりも多くの層があります。みんなありがとう。乞うご期待。数週間後にはもっと歓声が上がるかもしれません。 – ValenceElectron

答えて

14

あなたが見つけたのは、実装されていないシステムのスタブ機能です。実際に実装するには、sysdepsツリーを参照する必要があります。以下は、興味のある:

  • sysdeps/unix/sysv/linux
  • sysdeps/posix
  • sysdeps/i386(またはx86_64またはあなたのCPUのアーチがあるものは何でも)
  • 「別の定義doesnの場合に使用される汎用のスタブをだ
+0

私の答えを受け入れていただきありがとうございますが、特にglibcがシステムコールラッパーを構築する方法に興味がある場合は、他のものも見てください。私の答えはあなたの特定の質問( 'chdir'について)にあまり絞られていませんでしたが、システム固有の関数が実装されている場所/方法がもっと複​​雑であることを知りたければ、もっと役に立ちます。 –

7

存在しない。 weak_aliasは、chdirが要求されたときに__chdirが使用されるべきであるが、他の定義が見つからない場合にのみリンカーに指示するcppマクロです。 (詳細はweaksymbolsを参照してください)

chdir実際にはシステムコールです。 gibcソースツリーには、OS単位のシステムコールバインディングが存在します。これは、カーネルを呼び出す実際のスタブ定義を上書きします。これにより、glibcは、システム間で安定したインタフェースを提供でき、glibcが知っているすべてのシステムコールを持つことはできません。

8

chdir()の実際のシステムコールコードは、glibcでサポートされているほとんどのシステムでは、make-syscalls.shスクリプトによって自動生成されます。だからあなたはソースツリーでそれを見つけることができません。実際のシステムコールは、ソースツリー内のどこかに定義されていないことを

5

注 - 彼らはsyscalls.listからのビルド時に生成されている(リンクは/ UNIXは、さらに下に追加のものがあるsysdepsの1です)、 sysdep.h(リンクされているlinux/i386)のマクロと、実際にソースファイルを生成するa scriptという一連のマクロが含まれています。

+0

、ライブシステムでは、どのようにOSのAPIが呼び出されるのですか?アプリケーションをstraceすることは可能ですが、コードだけがglibcに実行されますか? – Massimo

関連する問題