タイトル/名前 | 更新者 | 更新日 |
---|---|---|
C言語系/NetBSD1.6における setjmp(), longjmp() の実装 | msakamoto-sf | 2010-01-04 01:52:31 |
日記/2010/01/03/ldオプションの--start-group,--end-group | msakamoto-sf | 2010-01-03 21:39:41 |
C言語系/ポインタ・配列の定義と宣言メモ1 | msakamoto-sf | 2010-01-03 18:55:26 |
日記/2010/01/02/C言語のJIS規格書 | msakamoto-sf | 2010-01-02 18:08:53 |
日記/2010/01/02/NetBSD(1.6)までインストールする羽目に。 | msakamoto-sf | 2010-01-02 15:04:35 |
技術/BSD/FreeBSD4.4自分用メモ | msakamoto-sf | 2010-01-02 14:29:03 |
日記/2009/12/31/2009年のまとめ | msakamoto-sf | 2009-12-31 23:59:44 |
日記/2009/12/31/FreeBSDでローカルのCVSupサーバを構築 | msakamoto-sf | 2009-12-31 20:49:48 |
TODO/YakiBiki/1.0.0 | msakamoto-sf | 2009-12-31 16:44:26 |
日記/2009/12/24/Twitterに続いてAmazonもDNS攻撃受けたか・・・ | msakamoto-sf | 2009-12-24 22:04:12 |
引き続き「エキスパートCプログラミング」ネタ。setjmp()とlongjmp()が出てきたので、早速実験。
ちょうど「デーモン君のソース探検」ようにCVSからソースを落としてきたNetBSD1.6があったので、setjmp()/longjmp()の中身を調べ、動作原理をgdbで追いつめていきたい。
まずは「エキスパートCプログラミング」に載っていたサンプルプログラム。
test7.c:
#include <stdio.h> #include <setjmp.h> jmp_buf buf; void banana() { printf("in banana()\n"); /* (2) */ longjmp(buf, 1); /* NOTREACHED */ printf("you'll never see this, because I longjmp'd.\n"); } int main() { if (setjmp(buf)) { printf("back in main\n"); /* (3) */ } else { printf("first time through...\n"); /* (1) */ banana(); } return 0; }
そのまま動かすと、上の"(1)","(2)","(3)"の順で処理が進むことが確認出来る。
$ ./test7 first time through... in banana() back in main
では早速gdbで追っていきたい。
が何なのか不思議だったのですが、ちょっと調べたらinfoにも載ってるしmanにも出てた。
http://www.jp.freebsd.org/cgi/mroff.cgi?sect=1&cmd=&lc=1&subdir=man&dir=jpman-6.0.0/man&man=ld
上はFreeBSD 6.0のmanページなんですが、CentOS5.2のldのmanページには出てなかったんですよね・・・。
NetBSD1.6/CentOS5.2では共にldのinfoページに出てました。
仕組みとしては上記manページの次の一文が端的に表していると思います。
アーカイブをグループ化すると、すべての可能な参照が解決されるま で、
それらのすべてのアーカイブは繰返し検索されます。
とりあえずこれで、staticリンクしようとした時のldのオプションは分かりました。
$ gcc -Wall -static -v -o hello_static hello.c ... /usr/libexec/gcc/i386-redhat-linux/4.1.2/collect2 -m elf_i386 --hash-style=gnu -static -o hello_static /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../crt1.o /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../crti.o /usr/lib/gcc/i386-redhat-linux/4.1.2/crtbeginT.o -L/usr/lib/gcc/i386-redhat-linux/4.1.2 -L/usr/lib/gcc/i386-redhat-linux/4.1.2 -L/usr/lib/gcc/i386-redhat-linux/4.1.2/../../.. /tmp/ccMRvVHp.o --start-group -lgcc -lgcc_eh -lc --end-group /usr/lib/gcc/i386-redhat-linux/4.1.2/crtend.o /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../crtn.o
あとは普通にダイナミックリンクでコンパイルした時の"--as-needed", "--no-as-needed"をまた後日調べてみたいですね・・・。".dynamic"セクションのDT_NEEDEDと関連するところまでは分かったのですが、具体的な部分がまだ理解し切れてない。
$ gcc -Wall -v -o hello hello.c ... /usr/libexec/gcc/i386-redhat-linux/4.1.2/collect2 --eh-frame-hdr -m elf_i386 --hash-style=gnu -dynamic-linker /lib/ld-linux.so.2 -o hello /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../crt1.o /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../crti.o /usr/lib/gcc/i386-redhat-linux/4.1.2/crtbegin.o -L/usr/lib/gcc/i386-redhat-linux/4.1.2 -L/usr/lib/gcc/i386-redhat-linux/4.1.2 -L/usr/lib/gcc/i386-redhat-linux/4.1.2/../../.. /tmp/ccPygftP.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/i386-redhat-linux/4.1.2/crtend.o /usr/lib/gcc/i386-redhat-linux/4.1.2/../../../crtn.o
「エキスパートCプログラミング」を読んでいたら、ポインタ/配列として定義したオブジェクトを別のファイルで配列/ポインタとして宣言すると動作がおかしくなるよ、誤解してるよ、という部分があったので、ちょっと面白そうなので試してみた。
を入手しようと思ったけど、画像ファイルのPDFになってて"しおり"は設定されてないしで、あんまり電子ファイルで持っていても意味無い感じだったのでやめた。規格書片手に読もうと思ってたC言語本があるのだけれど、そちらも元々は英語の本なので、JIS規格書ではなくISOワーキンググループの出してる規格書ベース。で、ISOの方のISO/IEC 9899 規格書のPDFはちゃんとテキストデータとして選択コピーや検索できるようになってるし、"しおり"も設定されてるので、いいよもうこっちで。
というかJIS規格書、Adobe ReaderでJavaScriptONになってないと真っ白い画面が表示されるようになってるし、ダウンロード出来ないようになってたし。(プログラム使って無理矢理ダウンロードしてみたら、勝手にどっかと通信して「ダウンロードしての閲覧は出来ません」とか怒られた)
FreeBSDのCVSupローカルミラーサーバも構築し、4.4→4.5へのCVSup使ったアップグレードにも成功。
ようやく デーモン君のソース探検―BSDのソースコードを探る冒険者たちのための手引き書 (BSD magazine Books) にとりかかれる、と、2004年に購入以来ずーっと本棚の肥やしになっていた本書を取り出してみたら。
対象BSDのソースがNetBSD 1.6だったよ・・・。
ということで、BSD Magazineのバックナンバーを掘り起こしてNetBSD 1.6を取り出してインストールする羽目になった。まぁホストOSはあんまり関係ないとは思うけど(要はCVSで取得したソースが手元にあればよいのだから)、折角なのでインストールに挑戦。これでFreeBSD/NetBSD/OpenBSDの3種類全てインストールを経験することになる。
以下、インストール後に最低限度環境整えたメモ。"The NetBSD Guide"見れば大体載ってた。
http://www.netbsd.org/docs/guide/en/index.html
・vigr、wheelに"root, foobar"としたらNG。空白いれたらアカンかったわ・・・。
・キーボードがデフォルト英語101キーボードになってて、インストール時も選択の余地が無い。
→"The NetBSD Guide" の "5.8. Changing the keyboard layout" 参照。
wsconsctl -k -w encoding=jp
で一時的に修正。起動時に設定したければ、/etc/wscons.conf で
encoding jp
を記述。
・ntpdateをシステム起動時に実行する:"The NetBSD Guide"の "29.2. The Network Time Protocol (NTP)" 参照。
「ソース探検」読むのであれば、この位で問題ない筈。あとpkgsrc展開してbashとかtcsh辺りを入れてお仕舞い。
個人的に一際変化が激しい一年でした。転職して、人間関係でメンタルを壊して、たった3ヶ月で退職したりしてます。
"日記/2009/"で始まるページの一覧から、今の状態に至る伏線と思えるエントリが幾つか見つかりました。
総じて、「Webシステム開発の世界にこのまま居ても、自分なりの幸せ状態にたどり着けるのか」という疑いに支配された一年でしたし、この疑い自体は未だに消えません。
技術面で振り返ってみると・・・
あっちゃこっちゃしてます。が、アセンブラ・Linuxカーネル・BSD系はある程度自分なりの道筋があって、その上で着手しやすそうな本だったり、気分的に面白そうな本を順繰りに消化してます。来年にはその辺の知識を全てつなげられ、何か面白そうなネタ記事にまとめられればなと思います。
今年の11月などは精神的に相当落ち込んでました。
そんな精神状態で、やぶれかぶれでセキュリティ会社に面接に行ったりして撃沈したりしました。
今年は色々と人と関わったな・・・ということで、公私ともに色々と沢山の人に迷惑かけたり、助けて貰ったりしました。ありがとうございます。
ひろさちやの仏教本にも随分助けられました。というか、ひろさちやの仏教本に出てくる「中道」「空」「布施」のお話と出会ってなかったら相当ヤバイ状態になっていたと思います。
仏教の考え方は、意識の話では最新の脳科学に通じ、ライフスタイルではコーチングや「うつ」「適応障害」への対処法に通じるという具合に、今でも充分通用します。
と言う辺りでhappy new year.
昨晩にかけてやってみました。VMwareで専用の仮想マシンを1台作成し、8GBほどのHDDにして手元に取りあえず転がっていた4.4BSD(古っ)を入れ、"/home"を6GBほど確保しました。
本当にCVSup「だけ」動いていれば良いので、インストール直後のほやほやマシンに、とりあえず cvsup パッケージを入れます。
続いて、ports/net/cvsup-mirror を入れます。(インストール時にportsも展開するよう指定済)
ちなみにMakefileを見ると、なんでパッケージになっていないのか(NO_PACKAGE)について "too interactive" とのこと。
# cd /usr/ports/net/cvsup-mirror # make ... Master site for your updates [cvsup-master.freebsd.org]? cvsup.jp.FreeBSD.org How many hours between updates of your files [1]? 168 Please answer 1, 2, 3, 4, 6, 8, 12, or 24 # 一週間で済まそうとしたら、24時間以内じゃないと駄目と怒られた。 How many hours between updates of your files [1]? 24 ... Do you wish to mirror the main source repository [y]?(そのままRETURN) Where would you like to put it [/home/ncvs]?(そのままRETURN) Do you wish to mirror the installed World Wide Web data [y]? n Do you wish to mirror the GNATS bug tracking database [y]? n Do you wish to mirror the mailing list archive [y]? n # WWWやbugtrack, mlなどは要らないので"n"にしときました。 ... # 以下は全てデフォルト、つまりそのままRETURN入力。 Unique unprivileged user ID for running the client [cvsupin]? Unique unprivileged group ID for running the client [cvsupin]? Unique unprivileged user ID for running the server [cvsup]? Unique unprivileged group ID for running the server [cvsup]? ... Syslog facility for the server log [daemon]? Maximum simultaneous client connections [8]?
で、うっかりただの"make"にしちゃってたので、この後 "make install" へ。
# make install ... (上で指定したユーザーとグループを作るか訊いてくるので、"y"にしとく。) ... Would you like me to set up the syslog logging [y]?(そのままRETURNにしとく。) Setting up server logging in "/etc/syslog.conf". Creating "/var/log/cvsupd.log". Giving syslogd a kick in the pants. Adding cvsupd log entry to "/etc/newsyslog.conf". Done. Would you like me to set up your crontab for updates every 24 hours [y]? Scheduling updates every 24 hours in "/etc/crontab". Done. The first update will be 5 minutes from now, at 21:32. The cvsupd server will be started automatically after the first update, and whenever you reboot. You are now a FreeBSD mirror site. ===> Registering installation for cvsup-mirror-1.2 ===> SECURITY NOTE: This port has installed the following startup scripts which may cause network services to be started at boot time. /usr/local/etc/rc.d/cvsupd.sh ...
cvsup-mirrorのinstall終了の5分後、21:32に最初の更新が始まることになります。
この段階で、"/etc/crontab" に次のようなエントリが設定されていました。
32 21 * * * root /usr/local/etc/cvsup/update.sh
そのまんまです。最初の更新が終われば、このエントリはコメントアウトしてしまいます。というのも、以降は「同期したい時だけ」手動で "/usr/local/etc/cvsup/update.sh" を実行することにしとくからです。VMware内での実験用ですし。
で、昨晩は21:32から最初の更新が始まり・・・終わったのが、日が変わって02:30前後。ADSLで速くもなく遅くもない程度の速度だと思っていますが、それで大体5時間強かかる感じです。
ディスク容量ですが、"/home"が "/home/ncvs" でCVSupミラー専用という状態で以下の使用量になりました。
# df -h Filesystem Size Used Avail Capacity Mounted on ... /dev/ad0s1e 6.3G 3.9G 1.9G 67% /home
6G用意しておいて正解でした。もう8-RELEASEまで到達しているソースコードのCVSup用データなので、それなりに巨大です。
では続いて、ちゃんとサーバとして動くか確認してみます。とりあえず同一マシン内の適当なディレクトリに、CVSupサーバを自分自身にして適当なコレクションを取ってこれるか確認してみました。
実験用と言うことで、"/root"の下にcvsupのDB用ディレクトリ(cvsup_test_db)と、ソース展開用のディレクトリ(cvsup_test_root)を作ります。
# cd # mkdir cvsup_test_db # mkdir cvsup_test_root
"/usr/share/examples/cvsup/standard-supfile" をコピペし、編集します。
# cp /usr/share/examples/cvsup/standard-supfile test-supfile # vi test-supfile ...
"test-supfile"の中身は、こんな感じにしてみました。
# 接続先は自分自身 *default host=localhost # cvsupのDBディレクトリ。 # この下に"sup"ディレクトリが作成され、その中にDB(ファイルリスト)が作成される。 *default base=/root/cvsup_test_db # ソースコード展開先ディレクトリ。 # この下に"src"ディレクトリが作成され、その下に展開される。 *default prefix=/root/cvsup_test_root # 4.xの開発ツリーから取得。(FreeBSD 4-STABLE) *default tag=RELENG_4 # この辺はもともとあったのをそのまま。 *default release=cvs *default delete use-rel-suffix *default compress # 軽めのソースツリーで試したいので、 # とりあえず"/etc"ディレクトリのコレクションを指定。 src-etc
cvsupを実行してみます。
# cvsup test-supfile Connected to localhost Updating collection src-etc/cvs Checkout src/etc/MAKEDEV Checkout src/etc/MAKEDEV.local Checkout src/etc/Makefile ... Checkout src/etc/termcap.small Checkout src/etc/usbd.conf Finished successfully
無事、"cvsup_test_root/src/etc" の下に、etcディレクトリやファイル群が展開されました。
"cvsup_test_db/sup"の下にも、"src-etc"コレクション用のデータファイルが作成されていました。
# cd cvsup_test_db/ # ls sup/ # find . . ./sup ./sup/src-etc ./sup/src-etc/checkouts.cvs:RELENG_4
この後、test-supfileの"tag"を、"RELENG_4_11"とか"RELENG_4_10"とかにしてcvsupしてみると、ちゃんとそのCVSタグの時点でのソースツリーに切り替わってくれます。
最後に、VMware仮想マシンで用意していた別のFreeBSDマシンで、同様のsupfileを用意してsrc-etcを展開出来ることを確認できました(詳細省略)。
このローカルCVSupサーバを使って、年明けはFreeBSDの"make world"の練習でもしてみようかと考えてます・・・。
YakiBiki 1.0.0 目安TODOリスト
Windows上でのtar.gz圧縮は避ける事。ツールによってファイル名がおかしくなったり空ディレクトリが無視されたりして、トラブルの遠因になりうる。
libs/config.php の _YB('yb.version') を忘れずに更新する。→config.phpよりは、init.phpへ移した方が良い?
SVN Repository Browser : http://yakibiki.svn.sourceforge.net/viewvc/yakibiki/
利用者が多いだけに、被害も大きいのだけど・・・SaaSとか大規模にAPI公開を展開しているTwitterとか、道連れ率、パねぇwww