binutils、gcc、およびホストシステムの内容に応じて、他のライブラリに接続する他のパッケージ用のバイナリパッケージ(rpm、debなど)をどのように生成しますか?
LFSプロジェクトは、ホストシステムから新しいシステムを分離するために、新しいシステムに対して異なるターゲットトリプルを使用してクロスコンパイルを偽造します(ここ)。これにより、ホストシステムにのみ存在するライブラリへのパッケージのリンクを防ぐことができます。ただし、同様のアプローチを使用してバイナリパッケージをビルドすると、パッケージはビルドされたシステムとは明らかに異なるターゲットトリプルを持ちます。
私は読んだこれgccのホスト分離の構築を議論する電子メール通信。しかし、結論は、LFSのような偽のクロスコンパイルがホストシステムから隔離されたgccを構築する唯一の合理的な方法であるということです。
--prefixと--with-sysrootを空のディレクトリに設定してbinutilsを構築しようとしましたが、結果のバイナリが私のホストシステムのlibflにリンクされました。
編集する:
私の元の説明は不明だと思います。より具体的な例を挙げましょう。
GNUバイナリチルGNU flexに依存しません。、私のアーチシステムで実行してこれを確認することができ、ldd /usr/bin/ar
に接続されていないことがわかりましたlibfl.so
。それにもかかわらず、Flexはまだ私のホストシステムにインストールされています。今度は、binutilsバイナリをコンパイルして、同じアーキテクチャを使用する別のシステムにコピーしたいと思います。この新しいシステムにはGNU Flexがインストールされていませんが、binutilsはGNU Flexに依存しないため、これは問題ではありません。問題は、ホストシステムでbinutilsをコンパイルするときにここにリンクされることですlibfl.so.2
!私はbinuitlsをビルドするときにflexがインストールされていることを「知って」リンクすることを決めるからだと思います。ホストシステムに存在するオプションの依存関係(flexなど)に接続せずにソフトウェア(binutilsなど)をコンパイルする方法を知りたいです。確かに、バイナリパッケージマネージャがソフトウェアをコンパイルしようとすると、同じ問題に直面するでしょうか?
Binutilsはこのような状況の一例に過ぎません。私は、パッケージマネージャがソフトウェアがホストシステムのオプションの依存関係に接続するのを停止するために使用できるより一般的な方法を探しています。
答え1
私が間違っているかもしれませんが(通常)答えは、ホストシステムから隔離されていないということです。
binutils、gcc、およびホストシステムの内容に応じて、他のライブラリに接続する他のパッケージ用のバイナリパッケージ(rpm、debなど)をどのように生成しますか?
彼らはこれをしません。 rpm、debなどはバージョンを含む依存関係を指定し、アーキテクチャごとに異なるRPMがあります。つまり、rpmとdebは、ターゲットシステムがすべて似ているように見えるという考えに基づいています。
ターゲットシステムとビルドシステムは同じように見えますか?私はパッケージマネージャではないので、私が知らない魔法があるかもしれません。私の理解は、これがターゲットシステムと同じタイプのシステムを構築することによって達成されるということです。少なくともビルド環境は一部chrootターゲット環境と同じレイアウトです。
LFSには、私が(15年前)読んだときに指摘しなかった微妙な点があります。 LFSはシステムなしで起動するため、いくつかのツールが必要で、システムの基本的なビルディングブロックの構築を開始します。しかし、外部から内部を見なければなりません。さもなければ、鶏と卵の問題に直面するでしょう。最初はシステムがなく、システム内に構築することもできませんでした。
LFSで実際に強調するのは、システムがインストールされたら外部からパッケージをコンパイルする必要がないことです。このシステムを使用して独自のパッケージを作成できます。これは、システム自体の一部を交換するために使用する計画、または他の同様のシステムに展開するために使用する計画の場合に機能します。
最初はこれはやや狂気の概念でした。 C言語でCコンパイラを書くのと同じです。まず、他の人のCコンパイラを使用してCコンパイラをコンパイルし、次にCコンパイラを使用してCコンパイラを再コンパイルします。そうすれば、他人から得たものを捨てることができます。
答え2
rpmベースの世界では、笑いツールを構築してください。 Mockはsystemd-nspawnコンテナを使用して孤立した環境を作成します。最小限の依存関係セットのみをインストールし、ビルドはコンテナで実行されます。したがって、ホスト環境から完全に隔離されます。実際にビルド環境ではさまざまなアーキテクチャ。