ToDo:
冬休みに昔作った nacl-gcc を Chrome の NaCl 上で動かすってのを復活させて、 bash の上で動かしてたりしてたのをチマチマ naclports に入れていっている。
その時一番困った問題は、これ
http://shinh.skr.jp/m/?date=20140103#p01
もうちょっと詳しく書いてみる。
最新の nacl-gcc/nacl-binutils で最新の nacl-binutils をビルドするとリンクがこけて、少し古い nacl-gcc/nacl-binutils で少し古い nacl-binutils もビルドできず、しかし古いので新しいのを作るか、新しいので古いのを作ると大丈夫という問題があった。
きっと ./configure がなんかヘンなもの detect しちゃって compile/link flag が微妙に違うとかそういうのだろーなーと見てみても、コマンドラインは基本一致している。
はてこれはいよいよおかしいなーと -v とかつけてみると、リンカスクリプトの prefix を指定するオプションが古いやつと最新で違う。古いやつは elf_nacl で新しいのは elf_i386_nacl 。しかしこれが一致してると動くならともかく、一致してると動かないのはヘンだ。
しょうがないから strace とかで様子を見ると、 ld をリンクする時だけ、カレントディレクトリにある ldscripts/elf*_nacl.x* とかを見ている。 ld をリンクする時は ld の出力ディレクトリに cd してからリンクしてるんだけど、この時 ldscripts ってディレクトリが既に置いてある。しかしこれ同じ内容のものがあるなら問題ないはずなんだけどなぁ、と見てみると、どうも static link 用の ldscripts が置いてあると気付く。
で、わかったことは nacl-glibc の shared link 用の ldscript はこっちのディレクトリにあって
https://chromium.googlesource.com/native_client/nacl-glibc/+/master/nacl/dyn-link/ldscripts
かつこれは後から ld の中に置いてある ldscripts と merge されているってこと。 linux 用の nacl-binutils をビルドする時はカレントディレクトリに置いてある NaCl 用の ldscripts は無視されるから問題ないんだけど、 NaCl 用の nacl-binutils をビルドする時は static link 用の設定を読んでしまうってわけ。
まぁ結局対処としてはカレントディレクトリにある ldscripts ディレクトリを ld をリンクする時だけ一時的に rename してやれば良くて、実際はこんな感じ
ld-new$(EXEEXT): $(ld_new_OBJECTS) $(ld_new_DEPENDENCIES) @rm -f ld-new$(EXEEXT) - $(LINK) $(ld_new_OBJECTS) $(ld_new_LDADD) $(LIBS) + # ./ldscripts/* will be read during this link and it messes up the + # link result because ./ldscripts contains the linker script for + # statically linked binaries. So, we temporary rename it. + mv ldscripts ldscripts.tmp && ($(LINK) $(ld_new_OBJECTS) $(ld_new_LDADD) $(LIBS) || (mv bar foo && false)) && mv ldscripts.tmp ldscripts
NaCl で遊んでると、大袈裟にハマってから、「俺だから致命傷で済んだがお前には NaCl は難しい」とか中二的な発言をしたくなるエピソードがたくさんできるわけだけど、これはまさにそういうインスタンスであった。
(01:36)
前 | 2014年 1月 |
次 | ||||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
全てリンクフリーです。 コード片は自由に使用していただいて構いません。 その他のものはGPL扱いであればあらゆる使用に関して文句は言いません。 なにかあれば下記メールアドレスへ。