試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

x86_64版Gentoo Linuxの32bitライブラリを自前で管理(chroot無しでemul-linux-x86-baselibsをビルド)

まず、

が必要。また、パッケージごとに、ヘッダファイルを要求する関係で、64bit版の各種パッケージも必要になる(これは他のemulパッケージにも言える)。

  1. ビルドエラーなしのパッケージ
  2. USE="-python"を指定するもの
  3. CUPS(1.2.10-r1)
  4. dbus(1.0.2-r2 USE="-X")
  5. dbus-glib(0.73)
  6. dbus-qt3-old(0.70)
  7. e2fsprogs(1.39-r2)
  8. gamin(0.1.9)
  9. giflib(4.1.4 USE=X)
  10. jpeg(6b-r7)
  11. Glib 2(2.12.13) libidn(0.6.9-r1 USE="nls -doc -emacs -java -mono")
  12. pam(0.78-r5 USE="berkdb pwdb")
  13. openldap(2.3.35-r1 USE="berkdb crypt gdbm readline ssl -perl -tcpd"
  14. インストールするebuildの例

ビルドエラーなしのパッケージ

  • binutils(2.18-r1)
  • bzip2(1.0.4)
  • com_err(1.39)
  • db(4.5.20_p2)
  • expat(2.0.1)
  • gdbm(1.8.3-r3 USE="berkdb")
  • glib(1.2.10-r5)
  • gpm(1.20.1-r5)
  • libart_lgpl(2.3.19-r1)
  • libmng(1.0.9-r1 USE="lcms")
  • libperl(5.8.8-r1 USE="berkdb gdbm")
  • libpng(1.2.18-r1)
  • nss_ldap(253)
  • ncueses(5.6-r1 USE="gpm unicode")
  • openssl(0.9.8e-r3 USE="zlib -emacs")
  • pwdb(0.62)
  • readline(5.2_p7)
  • slang(1.4.9-r2 USE="cjk unicode")
  • ss(1.39)
  • tiff(3.8.2-r2 USE="jpeg zlib")
  • zlib(1.2.3-r1)

USE="-python"を指定するもの

  • cracklib(2.8.10)
  • file(4.21-r1)
  • lcms(1.15 USE="jpeg tiff zlib")
  • libxml2(2.6.28 USE="readline")

CUPS(1.2.10-r1)

USE="-ssl"を指定。もしくは、gnutlsと、それに依存するパッケージの32bit版を別途用意することになる。

dbus(1.0.2-r2 USE="-X")

dbus-launchは使用されないので、USE="-X"でビルドする。

dbus-glib(0.73)

64bit版と32bit版とで異なるヘッダファイルが、依存パッケージであるGlib 2とD-BUSの両方に存在する。

  • Glibの/usr/lib32/glib-2.0/include/glibconfig.h
  • dbus/usr/lib32/dbus-1.0/include/dbus/dbus-arch-deps.h

これらを参照するよう、ヘッダファイルと.pcファイルを用意し、

$ tar jxf [tbz2の保存先]/dev-libs/glib-[バージョン(2系)].tbz2
$ tar jxf [tbz2の保存先]/sys-apps/dbus-[バージョン].tbz2
$ sudo mkdir /usr/lib32/pkgconfig  (まだ作成していない場合のみ)
$ sudo cp -r usr/lib32/glib-2.0/ /usr/lib32/
$ sudo cp -r usr/lib32/dbus-1.0/ /usr/lib32/
$ sudo cp usr/lib32/pkgconfig/* /usr/lib32/pkgconfig/

更にPKG_CONFIG_PATHを渡すことで、これら32bit版ヘッダを使用するようにできる。

$ sudo bash -c 'CHOST=i686-pc-linux-gnu ABI=x86 FEATURES="noman noinfo" PKGDIR=[tbz2の出力先] PKG_CONFIG_PATH=/usr/lib32/pkgconfig emerge -avBO dbus-glib'

「-I/usr/lib32/dbus-1.0/include」や「-I/usr/lib32/glib-2.0/include」がビルド中に見られるようならOK。

dbus-qt3-old(0.70)

64bit版QT3が必要。更に、上のdbus-glibと同様、32bit版dbus/usr/lib32/dbus-1.0/include/dbus/dbus-arch-deps.hを使用するように、ヘッダと.pcファイルの準備とPKG_CONFIG_PATHの指定をする。

$ sudo bash -c 'CHOST=i686-pc-linux-gnu ABI=x86 FEATURES="noman noinfo" PKGDIR=[tbz2の出力先] PKG_CONFIG_PATH=/usr/lib32/pkgconfig emerge -avBO dbus-qt3-old'

e2fsprogs(1.39-r2)

        CP e2fsck
make[2]: *** No rule to make target `../lib/libcom_err.a', needed by `e2fsck.sta
tic'.  Stop.
make[2]: Leaving directory `/var/tmp/portage/sys-fs/e2fsprogs-1.39-r2/work/e2fsp
rogs-1.39/e2fsck'
make[1]: *** [all-progs-recursive] Error 1

lib/の下にある「libcom_err.a -> /usr/lib32/libcom_err.a」のシンボリックリンクが壊れているため

$ sudo emerge -avfO emul-linux-x86-baselibs
$ tar jxf /usr/portage/distfiles/com_err-1.39.tbz2
$ sudo cp usr/lib32/libcom_err.a /usr/lib32/

libcom_err.aをコピーしておく。

gamin(0.1.9)

以下の修正をした上で、USE="-python"を付ける。

--- /usr/portage/app-admin/gamin/gamin-0.1.9.ebuild.orig
+++ /usr/portage/app-admin/gamin/gamin-0.1.9.ebuild
@@ -10,7 +10,7 @@
 LICENSE="LGPL-2"
 SLOT="0"
 KEYWORDS="alpha amd64 arm hppa ia64 m68k mips ppc ppc64 s390 sh ~sparc ~sparc-fbsd x86 ~x86-fbsd"
-IUSE="debug kernel_linux"
+IUSE="debug kernel_linux python"

 RDEPEND=">=dev-libs/glib-2
        !app-admin/fam"
@@ -39,6 +39,7 @@
        econf --disable-debug \
                $(use_enable kernel_linux inotify) \
                $(use_enable debug debug-api) \
+               $(use_with python) \
                || die "econf failed"

        emake || die "emake failed"

更に、dbus-glibなどと同様、Glib 2の32bit版のヘッダと.pcファイルを用意して

$ sudo bash -c 'CHOST=i686-pc-linux-gnu ABI=x86 FEATURES="noman noinfo" PKGDIR=[tbz2の出力先] PKG_CONFIG_PATH=/usr/lib32/pkgconfig USE="-python" emerge -avBO gamin'

のようにする。

giflib(4.1.4 USE=X)

lib64の修正をする。

--- /usr/portage/media-libs/giflib/giflib-4.1.4.ebuild.orig 
+++ /usr/portage/media-libs/giflib/giflib-4.1.4.ebuild
@@ -36,6 +36,9 @@
        # prevent circular depend #111455
        has_version media-libs/urt || export ac_cv_lib_rle_rle_hdr_init=no
        econf || die
+       if use amd64 && [[ "${ABI}" = "x86" ]]; then
+               find . -name Makefile | xargs sed -i -e 's/lib64/lib32/g'
+       fi
        emake || die "emake failed"
 }

jpeg(6b-r7)

先に(32bit版)libtoolをビルドしておいて、その中のusr/bin/libtoolを使用するのが楽。

$ tar jxf [tbz2の保存先]/sys-devel/libtool-[バージョン].tbz2
$ sudo cp usr/bin/libtool /usr/bin/libtool32
$ sudo bash -c 'CHOST=i686-pc-linux-gnu ABI=x86 FEATURES="noman noinfo" PKGDIR=[tbz2の出力先] MAKE="make LIBTOOL=/usr/bin/libtool32" emerge -avBO jpeg'

make-jオプションは手動で追加(例: MAKE="make -j2 LIBTOOL=...")。

Glib 2(2.12.13) libidn(0.6.9-r1 USE="nls -doc -emacs -java -mono")

FEATURESに「ccache」を付けると

../libtool: eval: line 4297: syntax error near unexpected token `|'
../libtool: eval: line 4297: `/usr/bin/nm -B  .libs/garray.o (中略) .libs/gspawn.o  libcharset/.libs/libcharset.a |  | /bin/sed 's/.* //' | sort | uniq > .libs/libglib-2.0.exp'
make[4]: *** [libglib-2.0.la] Error 1
make[4]: Leaving directory `/var/tmp/portage/dev-libs/glib-2.12.13/work/glib-2.12.13/glib'

のように、「| |」による文法エラーが出ることがあるが、その場合、上のjpegと同様、libtool32を使用することで回避できる。付けなければエラーにならない。

$ sudo bash -c 'CHOST=i686-pc-linux-gnu ABI=x86 FEATURES="noman noinfo" PKGDIR=[tbz2の出力先] MAKE="make LIBTOOL=/usr/bin/libtool32" emerge -avBO glib'

pam(0.78-r5 USE="berkdb pwdb")

cracklibのライブラリ検出では

$ cd /usr/lib32/
$ for ext in hwm pwd pwi; do sudo ln -s ../lib64/cracklib_dict.${ext}; done

上のように、/usr/lib64/以下の辞書ファイルにリンクを張ってエラー回避。

openldap(2.3.35-r1 USE="berkdb crypt gdbm readline ssl -perl -tcpd"

USE="-tcpd"を付けるか、32bit版tcp-wrappersを用意する。USE="-perl"も付ける。
db 4.5を使用する場合、

$ tar jxf [tbz2の保存先]/sys-libs/db-[バージョン(4.5系)].tbz2
$ sudo cp usr/lib32/*.so /usr/lib32/

バージョン4.5の.soファイルを事前にコピーしておく。

cc [CFLAGS] -o .libs/apitest apitest.o  -L/usr/lib32 ./.
libs/libldap.so /var/tmp/portage/net-nds/openldap-2.3.35-r1/work/openldap-2.3.35
/libraries/liblber/.libs/liblber.so ../../libraries/liblber/.libs/liblber.so ../
../libraries/liblutil/liblutil.a -lssl -lcrypto -lcrypt -lresolv
./.libs/libldap.so: undefined reference to `BIO_clear_flags'
./.libs/libldap.so: undefined reference to `BIO_set_flags'
./.libs/libldap.so: undefined reference to `SSL_CTX_set_info_callback'
collect2: ld returned 1 exit status
make[2]: *** [apitest] Error 1
make[2]: Leaving directory `/var/tmp/portage/net-nds/openldap-2.3.35-r1/work/ope
nldap-2.3.35/libraries/libldap'

上のエラーが出たら、手元でビルドしたopensslのtbz2ファイルから.soファイルを上書きコピー。

$ tar jxf [tbz2の保存先]/dev-libs/openssl-[バージョン].tbz2
$ sudo cp -d usr/lib32/*.so* /usr/lib32/

インストールするebuildの例

上のビルド作業の流れの中で手動で用意した/usr/bin/libtool32/usr/lib32/cracklib_dict.*などのファイルの用意をするようにしている。.aや.laファイル、.pcファイルに加えて、Glibなどのアーキテクチャ依存ヘッダも入れるようにしている。これら全てが不要ならUSE="nodevelop"で入れることで除外されるよう、ebuildをいじった。
ファイル名: emul-linux-x86-baselibs-9999.ebuild

# Copyright 1999-2007 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/app-emulation/emul-linux-x86-baselibs/emul-linux-x86-baselibs-10.2.ebuild,v 1.2 2007/03/02 15:01:34 blubb Exp $

inherit emul-libs

SRC_URI="mirror://gentoo/binutils-2.18-r1.tbz2
		mirror://gentoo/bzip2-1.0.4.tbz2
		mirror://gentoo/com_err-1.39.tbz2
		mirror://gentoo/cracklib-2.8.10.tbz2
		mirror://gentoo/cups-1.2.10-r1.tbz2
		mirror://gentoo/db-4.5.20_p2.tbz2
		mirror://gentoo/dbus-1.0.2-r2.tbz2
		mirror://gentoo/dbus-glib-0.73.tbz2
		mirror://gentoo/dbus-qt3-old-0.70.tbz2
		mirror://gentoo/e2fsprogs-1.39-r2.tbz2
		mirror://gentoo/expat-2.0.1.tbz2
		mirror://gentoo/file-4.21-r1.tbz2
		mirror://gentoo/gamin-0.1.9.tbz2
		mirror://gentoo/gdbm-1.8.3-r3.tbz2
		mirror://gentoo/giflib-4.1.4.tbz2
		mirror://gentoo/glib-1.2.10-r5.tbz2
		mirror://gentoo/glib-2.12.13.tbz2
		mirror://gentoo/gpm-1.20.1-r5.tbz2
		mirror://gentoo/jpeg-6b-r7.tbz2
		mirror://gentoo/lcms-1.15.tbz2
		mirror://gentoo/libart_lgpl-2.3.19-r1.tbz2
		mirror://gentoo/libidn-0.6.9-r1.tbz2
		mirror://gentoo/libmng-1.0.9-r1.tbz2
		mirror://gentoo/libperl-5.8.8-r1.tbz2
		mirror://gentoo/libpng-1.2.18-r1.tbz2
		mirror://gentoo/libtool-1.5.24.tbz2
		mirror://gentoo/libxml2-2.6.28.tbz2
		mirror://gentoo/ncurses-5.6-r1.tbz2
		mirror://gentoo/nss_ldap-253.tbz2
		mirror://gentoo/openldap-2.3.35-r1.tbz2
		mirror://gentoo/openssl-0.9.8e-r3.tbz2
		mirror://gentoo/pam-0.78-r5.tbz2
		mirror://gentoo/pwdb-0.62.tbz2
		mirror://gentoo/readline-5.2_p7.tbz2
		mirror://gentoo/slang-1.4.9-r2.tbz2
		mirror://gentoo/ss-1.39.tbz2
		mirror://gentoo/tiff-3.8.2-r2.tbz2
		mirror://gentoo/zlib-1.2.3-r1.tbz2"

LICENSE="|| ( Artistic GPL-2 ) || ( BSD GPL-2 ) BZIP2 CRACKLIB DB
		GPL-2 || ( GPL-2 AFL-2.1 ) LGPL-2 LGPL-2.1 MIT OPENLDAP openssl
		PAM ZLIB as-is"
KEYWORDS="-* ~amd64"
IUSE="nodevelop"

DEPEND=""
RDEPEND="!<app-emulation/emul-linux-x86-medialibs-10.2" # bug 168507

src_unpack() {
	allowed_common="^${S}/lib32/security/pam_filter/upperLOWER|^${S}/etc/env.d"
	use nodevelop && ALLOWED="(${allowed_common})" \
		|| ALLOWED="(${allowed_common}|^${S}/usr/lib32/glib|^${S}/usr/lib32/dbus|^${S}/usr/bin/libtool$|^${S}/usr/lib32/pkgconfig|.*lib32.*\.l?a$)"
	emul-libs_src_unpack
	rm -rf "${S}/etc/env.d/binutils/" \
			"${S}/usr/lib32/binutils/" \
			"${S}/usr/lib32/engines/" \
			"${S}/usr/lib32/openldap/" \
			"${S}/usr/lib32/python2.4/"

	ln -s ../share/terminfo ${S}/usr/lib32/terminfo

	if ! use nodevelop; then
		mv -f "${S}/usr/bin/libtool"{,32}
		for x in hwm pwd pwi; do
			ln -s ../lib64/cracklib_dict.${x} ${S}/usr/lib32/cracklib_dict.${x}
		done
	fi
}

インストール例。

$ sudo mkdir /usr/local/overlays/local/app-emulation/emul-linux-x86-baselibs/files -p
$ sudo mv emul-linux-x86-baselibs-9999.ebuild /usr/local/overlays/local/app-emulation/emul-linux-x86-baselibs/
$ sudo cp [tbz2の保存先] /usr/portage/distfiles/
$ sudo emerge -avu emul-linux-x86-baselibs