#このfixは古いNetBSDでも有効ですか?
#-current しかだめですね。
#だからバージョンみて切り替えないと。
#revision 1.125
date: 2009/09/24 21:21:34; author: pooka; state: Exp; lines: +43 -2
Add Solarisa-like dlinfo() interface to the ELF dynamic linker.
Implement RTLD_DI_LINKMAP which returns a pointer to the linkmap
chain at the given object. Other Solaris queries are currently
unimplemented.
#それも入れられます? 入ったらapplyします。
#NetBSD 5.99.18 が 9/18 で 5.99.19 が 9/27 だから 5.99.19 以上にすればいいかな
#% diff -u gc/dyn_load.c.orig gc/dyn_load.c
--- gc/dyn_load.c.orig 2009-11-04 17:36:21.000000000 +0900
+++ gc/dyn_load.c 2009-11-04 18:09:20.000000000 +0900
@@ -78,6 +78,8 @@
#endif
#if defined(NETBSD)
+# include <sys/param.h>
+# include <dlfcn.h>
# include <machine/elf_machdep.h>
# define ELFSIZE ARCH_ELFSIZE
#endif
@@ -499,6 +501,7 @@
return(0);
}
if( cachedResult == 0 ) {
+#if !defined(NETBSD) || !__NetBSD_Prereq__(5,99,19)
int tag;
for( dp = _DYNAMIC; (tag = dp->d_tag) != 0; dp++ ) {
if( tag == DT_DEBUG ) {
@@ -508,6 +511,15 @@
break;
}
}
+#else
+ struct link_map *lm = NULL;
+ int rv = dlinfo(RTLD_SELF, RTLD_DI_LINKMAP, &lm);
+ if (rv != 0)
+ return (0);
+ if (lm == NULL)
+ return (0);
+ cachedResult = lm;
+#endif
}
return cachedResult;
}
#こうかな
#0.9 rc1 でも gosh -ftest は動いて build すすんでる
#Total: 9943 tests, 9943 passed, 0 failed, 0 aborted.
Gauche scheme interpreter, version 0.9_rc1 [utf-8,pthreads]
#NetBSD/i386 5.99.21
#九月頭から 9/24 以前に2.19 に switch した port は、その間に build した環境では動かないけど、そこは -current だからということで。
#afk
#むー、__NetBSD_Prereq__のところがLinuxだと通りませんね。
#__NetBSD_Prereq__が完全に#if defined(NETBSD)...#endifの中に入るようにすれば通るけど。__NetBSD_Prereq__って多分#ifより先に__NetBSD_Prereq__マクロが展開されることを意図してるんだろうけど、cppの規格内でそれってできましたっけ。
#ポータブルコードでは全部展開してMAJORとk
#とかMINORとか比べるようにした方がいい気がする。
#あるいは#ifndef __NetBSD_Prereq__ #define __NetBSD_Prereq__(x,y,z) 0 #endif を直前にいれるかですかね。
#そうか、__NetBSD_Prereq___が引数つきマクロとして定義されてればパーズ可能ですね。
#パッチ入れました。他にもi4
#i386/glibcのスレッド絡みでgcに手が入ってるので、rc2にしてあります。今まで確認頂いたプラットフォームでももう一度確認して頂けるとありがたいです。
##Mac OS X 10.6.1(10B504) Intel(i386-apple-darwin) OKっす
#NetBSD 5 (x86_64)もOKですね
#dyn_load.c:521: error: `RTLD_DI_LINKMAP' undeclared (first use in this function)
dyn_load.c:521: error: (Each undeclared identifier is reported only once gcc -DPACKAGE_NAME=\"gc\" -DPACKAGE_TARNAME=\"gc\" -DPACKAGE_VERSION=\"7.1\" "-DPACKAGE_STRING=\"gc 7.1\"" -DPACKAGE_BUGREPORT=\"Hans.Boehm@hp.com\" -DPACKAGE_URL=\"\" -DGC_VERSION_MAJOR=7 -DGC_VERSION_MINOR=1 -DPACKAGE=\"gc\" -DVERSION=\"7.1\" -DGC_NETBSD_THREADS=1 -D_REENTRANT=1 -D_PTHREADS=1 -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1 -DNO_EXECUTE_PERMISSION=1 -DALL_INTERIOR_POINTERS=1 -DGC_GCJ_SUPPORT=1 -DJAVA_FINALIZATION=1 -DATOMIC_UNCOLLECTABLE=1 -DDONT_ADD_BYTE_AT_END=1 -DLARGE_CONFIG=1 -I./include -fexceptions -I libatomic_ops/src -O6 -march=pentium4 -c alloc.c -fPIC -DPIC -o .libs/alloc.o
#NetBSD 3.1_STABLEだとNGです
#boehm-gcのビルドがこけます。
#あれ、なんでそっちの条件にいくんだろう。そこはdefined(NETBSD) && __NetBSD_Prereq__(5,99,19)でないと通らないはずなのに。
#古すぎて__NetBSD_Prereq__が無かったとしてもそこは通らないはず…
#もしかして、509行目の!__NetBSD_Prereq__(5,99,19)を
#!(__NetBSD_Prereq__(5,99,19)) にしたら変わるかな。
#マクロの使い方間違えたか。指定したバージョン以下で真になるんだ。
じゃあなんで5.99.21で動いたんだろう、cleanし忘れ?
#そしたら否定を取ればいい?
#でもそれだとnetbsd5 でも動かないはずか。
#Mac OS X 10.5.8 (9L30) i386-apple-darwin9.8.0 も make check 通りました
##32ビットあふれてる?
#NetBSD-3まで対応するなら__NetBSD_Prereq__は使えないですね。自力で__NetBSD_Version__と比較する?
#自力か、configureで dlinfo他をしらべるかでしょうか。
#どこまで調べれば良いかがいまいち。このfixはboehm gcの方に反映させるべきだと思うんですが、その場合はNetBSDのバージョンで判断する方がよいかもしれません。
#(反映しとかないとgc-7.2に切り替える時にregressしてしまう可能性が)
#直接__NetBSD_Version__と比較するようにしてみました。NetBSDerな方確認お願いします。
#rc2のtarballもすげ替えてあります。
#Mac OS X (10.6.1)、NetBSD-5(STABLE x86_64)、NetBSD-3.1(STABLE x86_64) OKです
#まはろー。あとはNetBSD-currentだな。
#Debian lennyでもmake check OKでした。
#Mac OS X 10.5.8 (9L30) i386-apple-darwin9.8.0 も変わらず問題ありません
#ただ、 configure 時に stderr に次のようなメッセージが出ます
#configure: WARNING: "Explict GC_INIT() calls may be required."
rm: conftest.dSYM: is a directory
#ググってみると conftest.dSYM の方は configure の方の問題で実害はないみたいです
#GC_INIT の方も gc の configure の普通のメッセージなのかな
#rc2試したら、古いslackwareの方の環境で、gcのmake時に次のエラーが出ました
#pthread_support.c:414: error: conflicting types for 'GC_delete_thread'
pthread_support.c:393: error: previous implicit declaration of 'GC_delete_thread' was here
make[2]: *** [pthread_support.lo] Error 1
#パッと見たところ、GC_delete_thread()関数の定義順の問題っぽかったので、コピペして定義順を変更したら上手く動くようになりました
#古いSuSEの方では問題出てないので、やっぱりうちの環境特有っぽそうですが
#一応パッチにしてみました
##あれ、確かにGC_delete_threadは後から定義されてますね。なんでこっちでエラー出なかったんだろう。
#とりあえず宣言だけ先につけとけば大丈夫ですが。
#ああ、新しめのgccだとwarningになってたんですね。
#見てみたら、/* [SK] */のコメントのついたパッチで導入された部分でGC_delete_thread()を呼んでるから、定義よりも先に呼ばれるようになったんですね
#そゆことです。forward declaration入れたんで今は大丈夫だと思います。
#なるほどです。ありがとうございます
#金曜夜までiphone only なので誰か gauche 0.9rc2 netbsd 5.99.19 以降でテストできないかなぁ RT shiro: まはろー。あとはNetBSD-currentだな。 http://bit.ly/GOkRK #pkgsrc の中の人が本職か。何れにせよ pkgsrc もなおさないと。RT : shiro: どこまで調べれば良いかがいまいち。このfixはboehm gcの方に反映させるべきだと思うんですが、その場合はNetBSDのバージョンで判断する方がよい