この記事はおさむん家 Advent Calendar 2014の記事ですが、読んでも読まなくても構いません。
amd64環境上で、後方互換性の為に/lib32
や/usr/lib32
等が存在するのが不快で、かつ許せない人向け。
- 注意 32bitバイナリのビルド・実行はできなくなります。 skype等使いたい方は止めたほうが無難。(64bitネイティブ対応まだですかね・・・)
% ldd /lib/x86_64-linux-gnu/libc-2.19.so
/lib64/ld-linux-x86-64.so.2 (0x000055cf935e1000)
linux-vdso.so.1 (0x00007ffdee5fe000)
全てのプログラムからリンクされるライブラリであると同時に、標準ヘッダで宣言された全ての標準関数の実体であり、また、ユーザランドで動作するプログラムからカーネルの機能を呼び出す際の媒介者です。(ながい)
一般的に、64bitネイティブなライブラリは/lib
ないし/lib64
にインストールされ、片方のどちらかへシンボリックリンクが作成されます。
一方で32bitライブラリは/lib32
へインストールされます。以上のディレクトリ構成は/usr
以下でも同様です。
% ls -l /lib64/ld-linux-x86-64.so.2
lrwxrwxrwx 1 root root 32 9月 8 18:39 /lib64/ld-linux-x86-64.so.2 -> /lib/x86_64-linux-gnu/ld-2.19.so
ここで注意したいのが/lib32
にあるglibc
自体も32bitバイナリであり、決して「32bitだよー」と騙している訳では無いということ。
x86_64はあくまでx86の拡張であるため、カーネルの設定でCONFIG_IA32_EMULATION
が無効でない限り、ABIレベルでの互換性は保たれています。
ビルド時に必要なライブラリ等のインストールと、glibc
のソースを取得します。
# apt-get build-dep glibc
% apt-get source glibc
% cd glibc-2.19 # jessieの場合
通常、debパッケージ構築時のルールは./debian/rules
に記述されていますが、glibc
の場合は少々異なります。
Debianは多くのアーキテクチャに移植されている為、その全てに対するルールを単一のファイルに記述してしまったら、柔軟性も保守性もありません。
そこで、共通のルールは./debian/rules
に書き、アーキテクチャ固有のルールは./debian/sysdeps/*.mk
として分割する形をとっています。
今回はamd64環境なので./debian/sysdeps/amd64.mk
を編集します。
% headtail --pretty debian/sysdeps/amd64.mk
libc_rtlddir = /lib64
extra_config_options = --enable-multi-arch --enable-lock-elision
# build 32-bit (i386) alternative library
GLIBC_MULTILIB_PASSES += i386
:
:
:
mkdir -p debian/libc6-dev-x32/usr/include/x86_64-linux-gnu/gnu
cp -a debian/tmp-x32/usr/include/gnu/stubs-x32.h \
debian/libc6-dev-x32/usr/include/x86_64-linux-gnu/gnu/
endef
先頭2行以降はi386互換ライブラリに関する内容なので、ごっそり削除しましょう。
% cat debian/sysdeps/amd64.mk
libc_rtlddir = /lib64
extra_config_options = --enable-multi-arch --enable-lock-elision
ンギモッヂイイッ!
ビルドする際に使用するgcc
のバージョンを指定できます。
-
gcc-4.9を使用する例
DEB_GCC_VERSION ?= -4.9 ```
./debian/rules
のBULD_CFLAGS
を変更することで、コンパイラに対して最適化オプションを渡すことができます。
指定できるオプションについては、量が多すぎるので適宜調べて下さい。
-
どの環境でも通用するであろう例
BUILD_CFLAGS = -O3 -march=native -mtune=native -pipe -g
HOST_CFLAGS =
% dpkg-buildpackage -uc -us -d
かなり時間がかかりますので、キルミーでやすなちゃんの可愛さに酔いしれながら待ちましょう。 正常に終われば一つ上のディレクトリにdebパッケージが構築されています。
dpkg -i
するだけ。インストール後にパッケージをholdするのを忘れずに。