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 これはGentoobinutils のものです。

これを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 にリンクしたから…? 不明です。全くもって不明です。