私の目標は簡単です。できるだけ少ない依存関係を使用して、root以外のユーザーとしてすべてのアーキテクチャからnixパッケージマネージャを起動するプログラムを作成したいと思います。今私がしたことは次のとおりです。素晴らしいアーチを含むAlpineのミニマリストバージョンをコンソールにダウンロードしました。それから解凍し、その中に「chroot」(実際には元のルート)を指定しました。その後、ビルドのすべての依存関係をchrootにインストールし、適切なオプションでビルドしてからファイルをホストシステムにコピーします。
しかし、重要な問題があります。すべてのシステムには、file
「インタプリタファイル」(実行時に取得するファイル)が別の場所にあるようです。私のDebianではこのファイルがあります/lib64/ld-linux-x86-64.so.2
が、アルパインでは場所です/lib/ld-musl-x86_64.so.1
。したがって、実行すると同様のエラーが発生しますFile does not exists
(明らかに存在しますが)。
だから私の質問は次のとおりです。インタプリタがすべての(または少なくともほとんどの)Linuxディストリビューションで見つかるようにツール(nixなど)をどのようにコンパイルしますか?これが不可能な場合は、どういうわけかシステムにchroot / prootを適用し、ホストインタプリタを使用してファイルをホストに再コピーするときにインタプリタが良いインタプリタになるようにできますか?
ありがとうございます!
答え1
この種の問題を処理する方法は3つあります。
静的にビルドできる
nix
場合は、実行時に動的リンカーは必要なく、ほとんどすべての場所で動作します。 (これはまた、ライブラリの互換性の問題をうまく解決します。)各ターゲットlibcに対して一度に複数回ビルドできます
nix
。実際、LinuxではGNU libcとmusl(おそらくDietlibcも同様です)。これにより、ターゲット環境のlibcに基づいて適切に使用できるバイナリが提供されます。 Alpine Linuxについてはわかりませんが、Debianではこれが可能です。デフォルトのコンパイラを使用してGNU libcでビルドし、パッケージをインストールしmusl-dev
てmusl-gcc
muslとしてビルドできます。すべてのバイナリの依存関係を指定できます。するビルドを決定し、ターゲット環境にインストールします。たとえば、Debian派生バージョンにパッケージをインストールすると、
musl
Alpineに構築されたmuslベースのバイナリはDebian派生バージョンでより簡単に実行されます。