Binary Hacks 届きました、が#26 で。。。

Binary Hacks ―ハッカー秘伝のテクニック100選
Binary Hacks ―ハッカー秘伝のテクニック100選
高林 哲,鵜飼 文敏,佐藤 祐介,浜地 慎一郎,首藤 一幸

とりあえずは電車のなかでふむふむと読む。内容よくわかってないけど。
家にかえって早速テスト PenIIIのOpenBSD4.0

#26 TLS(スレッドローカルストレージ)を使う
の threadlocal.cを
gcc -lpthread -o threadlocal threadlocal.c
でコンパイルしてそのまま実行するとcore dumpしてしまう。
Segmentation fault (core dumped)

OpenBSD4.0だし非GENERICカーネルだからプログラムの
問題ともなんともいえず、gdbにcore食べさせると、

$ gdb threadlocal threadlocal.core
・・・
This GDB was configured as "i386-unknown-openbsd4.0"...(no debugging symbols found)

Core was generated by `threadlocal'.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /usr/lib/libpthread.so.6.3...done.
Loaded symbols for /usr/lib/libpthread.so.6.3
Symbols already loaded for /usr/lib/libpthread.so.6.3
Reading symbols from /usr/lib/libc.so.39.3...done.
Loaded symbols for /usr/lib/libc.so.39.3
Reading symbols from /usr/libexec/ld.so...done.
Loaded symbols for /usr/libexec/ld.so
#0 0x1c0006dc in func ()

funcが被告なご様子。バックトレースをとってみると


(gdb) bt
#0 0x1c0006dc in func ()
#1 0x00f9bf4b in _thread_start () at /usr/src/lib/libpthread/uthread/uthread_create.c:244
#2 0x0000001f in ?? ()
#3 0x00000000 in ?? ()
ぬう?
/usr/src/lib/libpthread/uthread/uthread_create.c:244
が裏で絡んでる?funcとどっちが卵だ鶏だ?
235 void
236 _thread_start(void)
237 {
238 struct pthread *curthread = _get_curthread();
239
240 /* We just left the scheduler via longjmp: */
241 _thread_kern_in_sched = 0;
242
243 /* Run the current thread's start routine with argument: */
244 pthread_exit(curthread->start_routine(curthread->arg));
245
246 /* This point should never be reached. */
247 PANIC("Thread has resumed after exit");
248 }
249 #endif
うーん。pthread_exitしてるだけなのか?
ライブラリが悪いのかプログラムが悪いのか。
不安要素たくさんなので試す気にならない。
そもそもCもpthread実装もよくわかってないだよ。
デバッグ用にコンパイル
gcc -g -lpthread -o threadlocal threadlocal.c
再度bt
#0 func (arg=0x0) at threadlocal.c:12
12 tls = num;
(gdb) bt
#0 func (arg=0x0) at threadlocal.c:12
#1 0x01b7df4b in _thread_start () at /usr/src/lib/libpthread/uthread/uthread_create.c:244
#2 0x0000001f in ?? ()
#3 0x00000000 in ?? ()
あ、わかった!

と本職の人ならひらめくのかもしれないが、ポルナレフにはひらめくは
ずもなく、12行目の tls = numのところでよくわからないけど
問題になっているようだったのでtlsを削除(ああ、Hackの意
味がない)したらCoredumpしなくなった。
Linuxだとフツーにうごくのかな?
追記:職場のRHEL3で確認したらきちんと動作した。

コメント

このブログの人気の投稿

4.3.0 Temporary Lookup Failureでドツボってた話

tomcat起動時の環境変数でJRE_HOMEを指定するときに

何が得られて何処へ向かうかだけを問うべき