Skip to content

Instantly share code, notes, and snippets.

@sasairc
Last active December 4, 2022 13:54
Show Gist options
  • Save sasairc/ee45c8de1adba38a2cc5 to your computer and use it in GitHub Desktop.
Save sasairc/ee45c8de1adba38a2cc5 to your computer and use it in GitHub Desktop.
Debian GNU/Linux (amd64)で、glibcをi386互換ライブラリ抜きでビルドする

Debian GNU/Linux (amd64)で、glibcをi386互換ライブラリ抜きでビルドする

この記事はおさむん家 Advent Calendar 2014の記事ですが、読んでも読まなくても構いません。

amd64環境上で、後方互換性の為に/lib32/usr/lib32等が存在するのが不快で、かつ許せない人向け。

  • 注意 32bitバイナリのビルド・実行はできなくなります。 skype等使いたい方は止めたほうが無難。(64bitネイティブ対応まだですかね・・・)

glibc(標準Cライブラリ)とは

% ldd /lib/x86_64-linux-gnu/libc-2.19.so
/lib64/ld-linux-x86-64.so.2 (0x000055cf935e1000)
linux-vdso.so.1 (0x00007ffdee5fe000)

全てのプログラムからリンクされるライブラリであると同時に、標準ヘッダで宣言された全ての標準関数の実体であり、また、ユーザランドで動作するプログラムからカーネルの機能を呼び出す際の媒介者です。(ながい)

/lib, /lib64, /lib32

一般的に、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の場合

amd64.mkの修正

通常、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

ンギモッヂイイッ!

rulesを弄る(オプション)

DEB_GCC_VERSION

ビルドする際に使用するgccのバージョンを指定できます。

  • gcc-4.9を使用する例

DEB_GCC_VERSION ?= -4.9 ```

BULD_CFLAGS

./debian/rulesBULD_CFLAGSを変更することで、コンパイラに対して最適化オプションを渡すことができます。 指定できるオプションについては、量が多すぎるので適宜調べて下さい。

  • どの環境でも通用するであろう例

BUILD_CFLAGS = -O3 -march=native -mtune=native -pipe -g HOST_CFLAGS = $(BUILD_CFLAGS) $(call xx,extra_cflags) ```

ビルド

% dpkg-buildpackage -uc -us -d

かなり時間がかかりますので、キルミーでやすなちゃんの可愛さに酔いしれながら待ちましょう。 正常に終われば一つ上のディレクトリにdebパッケージが構築されています。

インストール

dpkg -iするだけ。インストール後にパッケージをholdするのを忘れずに。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment