事前にビルドされた RPM パッケージで使用されたビルド フラグを特定することは可能ですか?

事前にビルドされた RPM パッケージで使用されたビルド フラグを特定することは可能ですか?

CentOS 6 VM で Quagga 動的ルーティング デーモンを使用しています。RPM がフラグ付きでビルドされた場合にのみアクセスできる機能を使用したいと思います--multipath=X。使用している RPM は既にビルドされており、CentOS リポジトリから取得されています。

RPM がこのフラグを使用してビルドされたかどうかを確認する方法はありますか? それとも、ソースからビルドして自分でそのフラグを指定する必要がありますか?

RPM ソース パッケージをダウンロードしたところ、付属の仕様ファイルでマルチパス パラメータが 64 に設定されていることに気付きました。そのため、必要に応じて自分でビルドすることができます。

答え1

一般に、ユーザー空間バイナリをビルドするために使用される特定のコンパイラ フラグは、バイナリ内に保存されません。保存する理由はありません。

通常、バイナリのビルドに使用されたコンパイラとコンパイラ バージョンは、それを調べることでわかりますcrt0が、その情報もカスタム を使用することで難読化できますcrt0

静的バイナリではないと仮定すると、バイナリがどの共有オブジェクト (「.so」) を使用しているか、およびバイナリが各共有オブジェクトのどの関数を使用しているかを調べることで、特定のコンパイル/ビルド時のオプションを推測できる可能性があります。

ソース コードがある場合は、逆アセンブリ リストを調べて、バイナリがビルドされたときに特定のオプション フラグが使用されたかどうかをかなり正確に判断できます。

答え2

@fpmurphy が言ったように、コンパイラ フラグは通常バイナリ内に保存されません。また、ビルド時のオプションはスクリプト--multipath=Xのオプションである可能性が高い./configureため、ファイルの生成を制御するなどの操作を行う可能性がありconfig.h、その場合、コンパイラ フラグにまったく影響を与えることなくビルド プロセスに参加します。

しかし、プログラムにそのようなオプションがたくさんある場合、時々(常にではないが) 関連するビルド時のオプションの状態を確認する方法。この情報が利用可能な場合は、programname --versionバージョン情報を表示する または同様のオプションを介して表示できることが多い。

クアッガについては全く知らないがターミナルモードコマンドを説明するドキュメントセクション有望そうなコマンドが 1 つあります。

指示:バージョンを表示

Quagga の現在のバージョンとビルド ホスト情報を表示します。

「ビルド ホスト情報」には、ビルド時のオプションに関する情報だけが含まれている可能性があります。または、含まれていない可能性があります。しかし、もっと簡単な情報源がない場合は、まずそこを調べることになります。

ソフトウェアがパッケージ化されていて、対応するソース パッケージが見つかる場合、一般的には、ソース パッケージには、同じディストリビューションの対応するバイナリ パッケージで配布されているものと少なくとも 100% 機能的に同等のバイナリを作成するために必要なすべてのビルド時構成が含まれていると考えられます。ディストリビューションが比較的新しい「再現可能なビルド」手法を使用している場合、結果として得られるバイナリはビット単位で同一である可能性もあります。

したがって、ソース パッケージ (RPM の場合は.spec特にそのファイル) は、対応するバイナリ パッケージで使用されるビルド時のオプションに関する優れた情報源となります。

確認したファイルのソース RPM.specも CentOS のリポジトリから取得され、バイナリと同じバージョンであったと仮定すると、--multipath=64バイナリ RPM の作成に使用されたというのが標準的な想定になります。実際にはそうではないことがわかった場合は、バグ レポートを作成するか、ディストリビューターに連絡して相違を報告する十分な理由になります。

関連情報