たなか です.
調査範囲広過ぎます(涙)

*

BINARY Hacksを読んで, GCC v4からMudflapなる機構が使えるように
なったと書いてあったので, portsからgcc41をインストールして
試してみました.

#蛇足ですがMudflap機構とは, バッファオーバーラン等の
  実行時エラーの検出をコードに埋め込む機構です.

このとき, 通常のプログラムであれば本に書いてあるとおりの
出力を得られるのですが, pthreadsを有効にしてコンパイルすると
こんな感じでcore dumpします.

[コマンドライン例]
gcc41 -pthread -g -fmudflapth hello.c -lmudflapth

[実行例]
[EMAIL PROTECTED] ./a.out
Fatal error 'Cannot initialize spinlock extra' at line 144 in file 
/usr/src/lib/libpthread/thread/thr_spinlock.c (errno = 0)
セグメントエラー(coreを出力しました)

#hello.cの内容は関係ない. こんなのでもいい.

  [hello.c]
  int main() {}

エラーメッセージから追っていくと, どうもlibmudflap.soの初期化ルーチンが
呼ばれる前にlibpthread.soの初期化ルーチンが呼ばれるのが原因かな, という
気がするのですが, 試しにくくて困ってます.
で,

・Shared libraryの初期化ルーチンを呼ぶ順序を制御する方法をご存知の方,
  いらっしゃいませんか?
・(もっとダイレクトに)同様の事象で対処できた方っていらっしゃいますか?

#これって, gccの問題のような気もしますが, 初期化ルーチンの呼び順だと
  するとFreeBSDのrtldの問題(仕様?)なんですよねえ.


書き忘れてましたが, 環境は

・FreeBSD 6.1-RELEASE i386
・gcc 4.1.2 (20061229版)(portsよりインストール)

です. 「currentなら動くよ」な情報でもいいので, 教えていただければ幸いです.
では.

--
たなかえいじ (aji@aji-oh.net)

メールによる返信