09 December 2009

glibc, coreutitities, stl, linux kernel のソースコード

オープンソースはソースコードが誰にでも無料で公開されています. unixやそのツール郡は, すべてオープンソースです. でもそういえば, 実際のソースコードを読んだことがない. ソースコードはどこで公開されているんだろう? ってことで, 普段お世話になっている基本的なソフトウエア: glibc, unixの標準的なツール(core utilities), stl, linux kernel のソースコードの場所を調べました.

glibc

glibc(gnu標準cライブラリ)はここから手に入ります.

The GNU C Library

gitレポジトリからcloneするか, ftpからダウンロードします.

とりあえず一番新しいっぽい, glibc-2.9.tar.gz というのをdlしました.

http://ftp.gnu.org/gnu/glibc/glibc-2.9.tar.gz

展開したら, 120MBもあります. でかい!

% du -h -s glibc-2.9
119M    glibc-2.9

中は, ほぼヘッダファイルごとにディレクトリに分かれていました. 例えばstrcmp()なんかだと, string/strcmp.c です. 中身はこれです.

#include 
#include 

#undef strcmp

/* Compare S1 and S2, returning less than, equal to or
   greater than zero if S1 is lexicographically less than,
   equal to or greater than S2.  */
int
strcmp (p1, p2)
     const char *p1;
     const char *p2;
{
  register const unsigned char *s1 = (const unsigned char *) p1;
  register const unsigned char *s2 = (const unsigned char *) p2;
  unsigned reg_char c1, c2;

  do
    {
      c1 = (unsigned char) *s1++;
      c2 = (unsigned char) *s2++;
      if (c1 == '\0')
     return c1 - c2;
    }
  while (c1 == c2);

  return c1 - c2;
}
libc_hidden_builtin_def (strcmp)

いくつかマクロがある以外は, 思ったよりも普通で, なんとか読めそうです.

GNU core utilities

no title

lsなど, unixのもっとも基本的なプログラム郡です. こちらもgitやhttp, ftp経由で提供されています. とりあえずまた一番新しいcoreutils-7.6.tar.gzをdlしました.

http://ftp.gnu.org/gnu/coreutils/coreutils-7.6.tar.gz

サイズは40Mでした.

% du -h -s coreutils-7.6
 40M    coreutils-7.6

コードはsrcディレクトリにあります. libディレクトリ下にはユーティリティ用の関数があるようです. 少し覗いてみましたが, グローバル変数の定義が外部ファイルにされていたり, ヘッダのインクルードが多重だったりして, 一度わかってしまえば簡単そうですが, それまでは読むのに時間がかかりそうです. コマンドライン引数の扱い方や, usageの表示の仕方などは参考になりました. yesコマンドのソースコード(src/yes.c)なんかは短くていい感じです.

STL

stlのコードはここから手に入ります. http経由で提供されています.

Download STL source code

v3.3をdlしました.

http://www.sgi.com/tech/stl/stl.tar

たった1.3Mしかないようです. すごい.

% du -s -h stl
1.3M    stl

驚いたことに, 中身はヘッダファイルしかありません. すべてのロジックはヘッダの中に書かれているようです. ということは, いちいちソースをダウンロードしてこなくても, includeパスの中にファイルはあるはずです.

探してみたら, やっぱりありました. 手元のmac osxだと, /usr/include/c++/4.0.0 にありました.

ふだんアプリケーションから直接インクルードしているヘッダファイル(iostreamとか)は, /usr/include/c++/4.0.0 直下に, サフィックスのない形で配置されています. 実質的なコードは bits というディレクトリ下に置かれていて, それぞれインクルードされています. backward というディレクトリの中には, 各ヘッダファイルに.hサフィックスをつけたものが置かれていて, それぞれ通常のサフィックスのないヘッダファイルをインクルードしています. 後方互換性のために, .hをつけても動作するようにしているようです. extディレクトリの中身は, sgiによるextensionとコメントの中で説明されていました. debugディレクトリの内容は, 開発時のデバッグ用でしょうか, なかの定義は__gnu_debug_defというnamespaceになっていました. tr1というディレクトリの内容は, TR1 C++ Library headerというものらしいのですが, tr1が何なのかがよくわかりません.

stlのコードはsgi(silicon graphics inc.)という会社のサイトで提供されていたんですが, 現在ライブラリをメンテナンスしているのはこちらの会社なんでしょうか. コードのコピーライトには, Free Software Foundation, Hewlett-Packard, Silicon Graphics Computer Systemsという3団体が併記されています.

Linux Kernel

The Linux Kernel Archives

最後に, linuxのkernelです. httpやftpなどで提供されています. 2.6.31.6をdlしました.

http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.31.6.tar.bz2

サイズは392Mでした. さすがに大きいです.

% du -s -h linux-2.6.31.6
392M    linux-2.6.31.6

ちょっと見ただけでは, 何が何だかさすがに分かりませんでした.