debian(3)

『70歳死亡法案可決』なんていう衝撃的タイトルの本が幻冬社から出てたので読んでみた。

こういうブラックな事はたけしさんとか、社会派ブログのあの人が論壇を張りそうだけど、著者 は、全く知らない人(失礼)だった。

少子高齢化で財政破綻寸前の我が日本。その元凶は年寄りが長生きし過ぎるんで、年金や医療費が かさみすぎちゃうから。だったら、70歳になったらみんな安楽死してね。そうすれば、年金の支払いも 減るし、介護とか医療費も大幅に抑えられる。

余ったお金で赤字の解消やら、将来の日本を背負う子供達に手厚い教育を施せる。なんと素晴らしい アイデア。洋行帰りの首相がこの法案を強引に可決しちゃったから、さー大変。 国内は喧々諤々の議論が勃発。昔は、姥捨て山が有ってだなあ、なんて言い出す人も居たりして。 少子高齢化に突入しつつある隣国では、こんな日本を興味深く見つめているとな。

そのうちに、闇法が有るなんて噂が流れだす。70歳を過ぎても、年金受け取り辞退、医療費全額 自己負担そして、各自の特技を生かしてボランティア活動出来る人は、生きててもいいよ。

魔さに、施政者にとっては夢のような法案ですなあ。みんな、よーく考えてみよう。

敬老の日を前に、こんな本を読んでていいものやら。どうせなら、『ピンピン・コロリ』の 方が敬老の日に相応しいぞ。

爆弾の再現実験

前回は、debianでSchemeを動かしたら爆弾が出た。それで、 原因の推定をしたんだった。曰く、移植中のSchemeとgccの相性が悪くそのせいで、爆弾が出たとな。 相性の方は確認がそれなりに大変そうなので、爆弾炸裂に到る再現実験をやって裏取りをしてみる。

#include <stdio.h>

int main(void){
FILE *pp;

        pp = fopen("t.c", "r");
        fclose(pp);
        fclose(pp);
}

これ、一目瞭然のコードだ。これと同じ事が現場で発生してると推測した訳だ。走らせてみる。

sakae@debian-powerpc:~/t$ cc -g t.c
sakae@debian-powerpc:~/t$ ./a.out
*** glibc detected *** ./a.out: double free or corruption (top): 0x102dc008 ***
======= Backtrace: =========
/lib/libc.so.6(+0x82de4)[0xfef0de4]
/lib/libc.so.6(cfree+0x8c)[0xfef645c]
/lib/libc.so.6(fclose+0x18c)[0xfedbaec]
./a.out[0x10000514]
/lib/libc.so.6(+0x1f69c)[0xfe8d69c]
/lib/libc.so.6(+0x1f860)[0xfe8d860]
======= Memory map: ========
00100000-00103000 r-xp 00000000 00:00 0          [vdso]
0fe6e000-0ffd8000 r-xp 00000000 03:03 559584     /lib/libc-2.11.3.so
0ffd8000-0ffe8000 ---p 0016a000 03:03 559584     /lib/libc-2.11.3.so
0ffe8000-0ffec000 r--p 0016a000 03:03 559584     /lib/libc-2.11.3.so
0ffec000-0ffed000 rw-p 0016e000 03:03 559584     /lib/libc-2.11.3.so
0ffed000-0fff0000 rw-p 00000000 00:00 0
10000000-10001000 r-xp 00000000 03:03 2705       /home/sakae/t/a.out
10010000-10011000 rw-p 00000000 03:03 2705       /home/sakae/t/a.out
102dc000-102fd000 rwxp 00000000 00:00 0          [heap]
48000000-48020000 r-xp 00000000 03:03 559595     /lib/ld-2.11.3.so
48020000-48021000 rw-p 00000000 00:00 0
48021000-48022000 r--p 00021000 03:03 559595     /lib/ld-2.11.3.so
48022000-48023000 rw-p 00022000 03:03 559595     /lib/ld-2.11.3.so
48027000-48028000 rw-p 00000000 00:00 0
48100000-48121000 rw-p 00000000 00:00 0
48121000-48200000 ---p 00000000 00:00 0
bfb18000-bfb2d000 rw-p 00000000 00:00 0          [stack]
Aborted

おめでとう。見事に再現しましたね。0x102dc008ってのはヒープエリアに取られるのか。ファイル ディスクリプターの本体はmallocを使って確保してんのね。fopenとfcloseの組をmallocとfreeの組に 変えて実験しても、爆弾炸裂したよ。

debian source

前回は爆弾の仕組みを調べる為に、直接glibcを落としてきた。まあ、これでもいいんだろうけど、 郷に入ったら郷に従えのことわざに習って、debian流にやってみるか。

多分、ソースを取ってくるのも、apt-getでいけるんだろうなと思って、manしたら、サブコマンドに sourceなんてのが有った。これを使えば、今入ってるbinaryに対応したソースが御取り寄せ出来そう。 早速やってみんべ。お取り寄せ品がhome-dirの中にちらからないように、一応適当は小部屋を 用意しておく。そして、小さなソースで確認。

sakae@debian-powerpc:~/deb-src$ apt-get source screen
  :
Unpack command 'dpkg-source -x screen_4.0.3-14.dsc' failed.
Check if the 'dpkg-dev' package is installed.
E: Child process failed

何やら、受け取り準備をしておけとな。dpkg-devを入れたら、g++とかfake-rootとか、あんた パッケージも開発するんでしょって言うぐらい、大仰な道具が送られてきましたよ。そんじゃ、 お目当てのlibc6をば。

sakae@debian-powerpc:~/deb-src$ apt-get source libc6
Reading package lists... Done
Building dependency tree
Reading state information... Done
Picking 'eglibc' as source package instead of 'libc6'
NOTICE: 'eglibc' packaging is maintained in the 'Svn' version control system at:
svn://svn.debian.org/pkg-glibc/glibc-package/
Need to get 23.6 MB of source archives.
Get:1 http://ftp.debian.org/debian/ squeeze/main eglibc 2.11.3-3 (dsc) [2,609 B]
Get:2 http://ftp.debian.org/debian/ squeeze/main eglibc 2.11.3-3 (tar) [22.7 MB]
Get:3 http://ftp.debian.org/debian/ squeeze/main eglibc 2.11.3-3 (diff) [914 kB]
Fetched 23.6 MB in 2min 3s (191 kB/s)
gpgv: keyblock resource `/home/sakae/.gnupg/trustedkeys.gpg': file open error
gpgv: Signature made Mon 13 Feb 2012 04:14:30 AM JST using DSA key ID F1BCDB73
gpgv: Can't check signature: public key not found
dpkg-source: warning: failed to verify signature on ./eglibc_2.11.3-3.dsc
dpkg-source: info: extracting eglibc in eglibc-2.11.3
dpkg-source: info: unpacking eglibc_2.11.3.orig.tar.gz
dpkg-source: info: applying eglibc_2.11.3-3.diff.gz

libc6に変わって、eglibcを落としましたってね。これがデビアン流ってやつですか。 昔こんな記事が出て、心配された ようですが、旨く動いてるようです。

で、malloc.cをglibcのそれと比べてみたけど、eglibcの方は、コメントがしっかり入っていて 勉強にはうってつけっぽい。ゆっくり読んでみるかな。

on ubuntu

デビアン様とDNAが一緒なウブではどうかと爆弾炸裂実験をした所、無事に爆発してくれたよ。 ウブの場合は、libcが入ってる所が、デビアン様とは若干違うのね。初めて知りました。

sakae@ubuntu:~/t$ ldd a.out
        linux-gate.so.1 =>  (0xb772f000)
        libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb757d000)
        /lib/ld-linux.so.2 (0xb7730000)
sakae@ubuntu:~/t$ ls -l /lib/i386-linux-gnu/libc.so.6
lrwxrwxrwx 1 root root 12 Apr 20 10:01 /lib/i386-linux-gnu/libc.so.6 -> libc-2.15.so

折角ウブを立ち上げたので、カーネルのソースを取り寄せてみた。

sakae@ubuntu:~/ubn-src/linux-3.2.0$ ls
arch     debian         firmware  Kbuild       Makefile        samples   ubuntu
block    debian.master  fs        Kconfig      mm              scripts   usr
COPYING  Documentation  include   kernel       net             security  virt
CREDITS  drivers        init      lib          README          sound
crypto   dropped.txt    ipc       MAINTAINERS  REPORTING-BUGS  tools
sakae@ubuntu:~/ubn-src/linux-3.2.0$ ls arch/
alpha     cris     ia64     microblaze  parisc   sh     unicore32
arm       frv      Kconfig  mips        powerpc  sparc  x86
avr32     h8300    m32r     mn10300     s390     tile   xtensa
blackfin  hexagon  m68k     openrisc    score    um

Linuxも暫くみないうちに、随分色々な石で動くようになったのね。blackfinってDSPな石だったかなあ? どこかで聞いた事あるぞ。ああ、アナログデバイス で出してたDSPだ。こりゃ、組み込みまっしぐらな用途だな。

隠れた用途として、無線機にDSP組み込んでSDRしたいとかがありそう。何でこんな石を 知ってたかと言うと、こういうページを見てたからです。 ああ、世の中、5ホップで繋がるというけど、3ホップぐらいで行き着いたよ。

on ArchLinux

実験はいろいろな環境でやってみるものです。デビアン系を離れて、普通?のLinuxで やってみます。おいらに取って普通のLinuxって、ArchLinuxなんですけどね。こやつの設定が 今までは、/etc/rc.confに書いておくって、おいら好みだったんだけど、わけわかめな 方向に走りつつあるんで、いつまで我慢出来るか?

[sakae@archbang t]$ ./a.out
*** glibc detected *** ./a.out: double free or corruption (top): 0x09586008 ***
======= Backtrace: =========
/lib/libc.so.6(+0x72702)[0xb766a702]
/lib/libc.so.6(fclose+0x14c)[0xb765a1fc]
./a.out[0x8048475]
/lib/libc.so.6(__libc_start_main+0xf5)[0xb7611605]
./a.out[0x8048361]
======= Memory map: ========
08048000-08049000 r-xp 00000000 08:04 275029     /home/sakae/t/a.out
08049000-0804a000 rw-p 00000000 08:04 275029     /home/sakae/t/a.out
09586000-095a7000 rw-p 00000000 00:00 0          [heap]
b75c2000-b75de000 r-xp 00000000 08:03 288313     /usr/lib/libgcc_s.so.1
b75de000-b75df000 rw-p 0001b000 08:03 288313     /usr/lib/libgcc_s.so.1
b75f7000-b75f8000 rw-p 00000000 00:00 0
b75f8000-b7797000 r-xp 00000000 08:03 137744     /lib/libc-2.16.so
b7797000-b7798000 ---p 0019f000 08:03 137744     /lib/libc-2.16.so
b7798000-b779a000 r--p 0019f000 08:03 137744     /lib/libc-2.16.so
b779a000-b779b000 rw-p 001a1000 08:03 137744     /lib/libc-2.16.so
b779b000-b779e000 rw-p 00000000 00:00 0
b77b5000-b77b7000 rw-p 00000000 00:00 0
b77b7000-b77b8000 r-xp 00000000 00:00 0          [vdso]
b77b8000-b77d8000 r-xp 00000000 08:03 137762     /lib/ld-2.16.so
b77d8000-b77d9000 r--p 0001f000 08:03 137762     /lib/ld-2.16.so
b77d9000-b77da000 rw-p 00020000 08:03 137762     /lib/ld-2.16.so
bfad4000-bfaf5000 rw-p 00000000 00:00 0          [stack]
Aborted

実験成功。どうやら、素のglibcを使ってるみたいです。

freebsd ではどうよ

違うOSだとどうかって事で、FreeBSDでやってみると

[sakae@secd ~/t]$ ./a.out
[sakae@secd ~/t]$ gdb a.out
GNU gdb (GDB) 7.4.1 [GDB v7.4.1 for FreeBSD]
  :
(gdb) run
Starting program: /usr/home/sakae/t/a.out
[Inferior 1 (process 14505) exited with code 0377]

エラーも、なーんにも出てこない! ひょっとしてザルなんかと思って、gdbから走らせてみると 微妙にエラーを報告してる。

[sakae@secd ~/t]$ ./a.out
[sakae@secd ~/t]$ echo $?
255

終了コードに慎ましくエラーって報告してるよ。派手さが無いね。とか思ってmanを引いてみると

戻り値
     正常終了すると 0 が返されます。正常終了しなかった場合は EOF が返され、グ
     ローバル変数 errno には、エラーを示す値が設定されます。どちらの場合でも、
     ストリームにはそれ以上アクセスできません。

エラー
     fclose() 関数がエラーなると、ルーチン close(2) か fflush(3) で指定された
     エラーが errno に設定されます。

注
     fclose() は NULL 引数を処理しません。 NULL 引数はセグメンテーション違反を
     引き起こします。この動作は意図的なもので、 FreeBSD で作成されたプログラム
     のバグをなくすためです。この動作は実装に関わるものであり、プログラムが依
     存すべきではありません。

人生いろいろ、ポリシーいろいろ。

読書の秋、読ソースの秋が到来。いろいろ面白そうなものを呼んで、読んでみる予定。 いままで、週に1回更新してきた当ページも、暫くは不定期更新にする事にしました。 それでは、また。