ld-elf.so.2 解決編
ld-elf.so.2 が build できました。
とりあえずDragonFlyのツールを使ってビルドしてみます。 /usr/libexec/gcc44/gcc です。 ld がどうも怪しいかな?と検討をつけてどんな ld が使われているのかを調べます。
# /usr/libexec/gcc44/gcc -print-progname=ld ld
なので、 PATH の中の ld すなわち /usr/bin/ld これはGentoo のbinutils のものです。
これをDragonFly の ld を使うようにしてコンパイルしてみます。
# PATH=/usr/libexec/binutils220/elf:/bin CC=/usr/libexec/gcc44/gcc /usr/bin/make
DragonFly の ld のために /usr/libexec/binutils220/elf と rm のために /bin とに PATH を通しています。すると、うまくいきます。
さて…どうも binutils が悪いらしい…。
DragonFly の binutils にあたっているパッチをしらべましょう。
# cd ~/dragonflybsd/contrib/binutils-2.20 # git log . commit 6034594f0309ae188708a94cdb0d3035b19102a0 Author: Simon Schubert <corecode _ dragonflybsd.org> Date: Wed Oct 28 12:45:58 2009 +0100 binutils220: add local modifications commit 735436b9f32e3e4937b7e51bd73f10fe49013e72 Author: Simon Schubert <corecode_dragonflybsd.org> Date: Wed Oct 28 12:45:52 2009 +0100 binutils220: add our READMEs commit 8e158dd092f098bc237ecd0be53f8894f968f328 Author: Simon Schubert <corecode_dragonflybsd.org> Date: Wed Oct 28 10:53:46 2009 +0100 Import binutils-2.20 # git show 603459 > /tmp/binutils.patch
これで patch が見れます。これが多分 binutils-2.20.1-r1 にあたるはず…確認します。
# ebuild ~/src/gentoo-dfbsd/portage-overlay/sys-devel/binutils/binutils-2.20.1-r1.ebuild unpack # cd /var/tmp/portage/sys-devel/binutils/work/binutils-2.20.1-r1/ # patch -C -p3 < /tmp/binutils.patch
こうすると、 Hank #n succeed やら Hank #n failed やら出ます。今回は全て succeed でそのまま patch を当てることができます。
んで、 binutils/bfd/config.bfd の
i[3-7]86-*-dragonfly*) targ_defvec=bfd_elf32_i386_vec targ64_selvecs="bfd_elf64_x86_64_vec bfd_elf64_l1om_vec" ;;
において、 DragonFly binutils のサポートするバイナリフォーマットは elf32_i386 になってます。 これにあわせて他の部分も変えていきます。
binutils/gas/configure.tgt
i386-*-dragonfly*) fmt=elf em=386bsd ;;
binutils/ld/configure.tgt
i[3-7]86-*-dragonfly*) targ_emul=elf_i386 targ_extra_emuls="i386bsd" ;;
(素のDragonFlyだと上の二箇所は変えなくても動いているんですけどね…なぜだろう…)
とりあえずこの変更で bintutils を再度 emerge して make してみたところ ld-elf.so.2 は無事に dynamic linked になり SEGV なく動くようになりました。
正直なところ根本原因はわかってないです… FreeBSD のバイナリフォーマットで出たものを elf_i386 にリンクしたから…? 不明です。全くもって不明です。