32ビットIntel x86用に動的にコンパイルされたバイナリがあり、それを64ビットx86-64 Guixシステムで実行しようとしているとします。このバイナリは他のシステムでコンパイルされました。どのように実行しますか?
Ubuntuでは、同じことを行う方法についての説明がここにあります。Ubuntu 64ビットで32ビットアプリケーションを実行する方法は?
答え1
Guixシステムでバイナリを実行する際の問題の1つは、ライブラリの実際の場所がわからないことです。彼らはグローバルにインストールされたライブラリを使いたいのですが、guixはそれをストアにのみインストールします。 2つの回避策があります。バイナリがライブラリを見つけることができる環境を作成するか、バイナリにパッチを適用してライブラリを見つけることができます。
どちらのソリューションもどのライブラリが必要かを知る必要があります。これを試してみてください(パッケージldd
から):glibc
$ ldd my-binary
linux-vdso.so.1 (0x00007ffe80da9000)
libdl.so.2 => not found
libc.so.6 => /gnu/store/fa6wj5bxkj5ll1d7292a70knmyl7a0cr-glibc-2.31/lib/libc.so.6 (0x00007f7651b77000)
/gnu/store/fa6wj5bxkj5ll1d7292a70knmyl7a0cr-glibc-2.31/lib/ld-linux-x86-64.so.2 (0x00007f7651d3b000)
これで、どのライブラリファイルが必要かを知ることができます。これを記録してglibc
実行するために必要なパッケージを見つけます。
コンテナを含む
最初のソリューションでは、グローバルな場所にライブラリとバイナリを公開するコンテナを作成する必要があります。-s i686-linux
基本アーキテクチャの代わりに、このアーキテクチャの環境をどのように構築したかに注意してください。
PROFILE=$(guix environment -C -N --ad-hoc glibc ... -s i686-linux -- bash -c 'echo $GUIX_ENVIRONMENT')
guix environment -C -N --ad-hoc glibc ... -s i686-linux --expose=$PROFILE/lib=/lib --expose=$PROFILE/lib=/lib64
最初の行は、PROFILE
環境用に作成した構成ファイルへのパスを含む変数を生成します。 echoコマンドを実行し、すぐに存在します。 bashが発生したくないので、一重引用符を使用することが不可欠です。外部変数の環境を拡張します。 2番目のコマンドは実際に環境に移動します。プログラムにグラフィック表示が必要な場合は、より多くのコンテンツを共有/公開する必要があります。
パッチを含む
2番目の回避策は、バイナリをパッチして通常の環境で実行できるようにすることです。これは、グラフィックインターフェイス、オーディオ、またはその他のハードウェアにアクセスする際の問題を軽減することを意味します。これはpatchelfを使用し、手動方式(高速で汚れた)またはパッケージ方式の2つの方法があります。
速くて汚い
迅速で汚い方法は、次のように(glibcの場合)以前に気付いたすべての依存関係を構築することです。
$ guix build glibc -s i686-linux
/gnu/store/9728x9zhj8d3zlyzsjpz342jpccrgkgd-glibc-2.31
これにより、店舗ルートが提供され、店舗に在庫があることを確認できます。
ここで(patchelf
パッケージ内)patchelfを使用してください:
patchelf --set-interpreter /gnu/store/...-glibc-.../lib/ld-linux.so.2
patchelf --set-rpath /gnu/store/...-glibc-.../lib:/gnu/store/.../lib:/gnu/store/.../lib:...
インタプリタはld-linux.so.2(32ビット用)とrpath(動的ライブラリ検索パス)に設定されます。必須ライブラリーがあるコロンで区切られたディレクトリーのリストでなければなりません。
この方法は比較的高速ですが、gcルートを登録せずにguixが更新されるか、ガベージコレクタが実行されるたびに再実行する必要があるため、乱雑です。
パッケージの使用
最後の可能性は、依存関係情報を登録するバイナリのパッケージ定義を生成することです。この方法を使用して構成ファイルにバイナリをインストールすることもできます。 nonguixで使用できますbinary-build-system
。https://gitlab.com/nonguix/nonguix
この方法の1つの欠点は、バイナリファイルをリポジトリにコピーし、バイナリファイルが大きくなる可能性があることです。ただし、パッケージ定義を使用すると、いつでも再構築してパッケージを更新できるため、将来指向です。バイナリビルドシステムは、本質的に宣言的な方法で上記のpatchelfコマンドを実行します。次のようにパッケージを定義できます。
(package
(name "my-binary")
(version "version")
(source (local-file "/home/..."))
(build-system binary-build-system)
(arguments
`(#:patchelf-plan
`(("my-binary" ("libc" "gcc:lib" ...)))
#:install-plan
`(("my-binary" "bin/"))))
(inputs
`(("gcc:lib" ,gcc "lib")))); note how the first string must match the one in
; patchelf-plan. libc is already implicitely defined
その後、次のようにしてこのパッケージをビルドできます。
guix build -s i686-linux -f my-package.scm