0

次の要件があります。バイナリが変更されたかどうかを確認する。

私のソースコードは変更されていません。(ソースコードを変更せずに)バイナリを再コンパイルすると、バイナリが変更されていることに気付きます。サイズではなく、内容です。

少しデバッグしてみると、バイナリファイルの中に「リンクタイム」と呼ばれるものがあることがわかりました。これは、バイナリがリンクされたときの実際のタイムスタンプです。これで、コンパイルごとに異なるタイムスタンプが与えられるため、バイナリの内容は常に異なります。しかし、実際には同じである必要があります。

ソースコードの変更によってバイナリが実際に変更されたかどうかを確認する方法を誰かに提案してもらえますか?

ありがとう

4

1 に答える 1

5

Windows(すべての.objファイルのファイルヘッダーにコンパイルタイムスタンプがある)とは異なり、UNIXオブジェクトファイル、特にELFファイルはいかなる種類のタイムスタンプもエンコードしません。

ただし、ソースがマクロを使用している場合、コンパイルによって生成されたオブジェクトファイルは明らかに変更されます__TIME__。また、バイナリ__DATE__を構築している場合は、コンパイルタイムスタンプを含むすべての種類の情報をデバッグ情報の一部として記録できます。-g

最後に、使用しているリンカーがリンクのタイムスタンプを(ベンダーの拡張機能として)記録している可能性があります。

最初のタスクは、あるビルドから次のビルドへの違いがどこから来るのかを理解することです。

との場合は、ソースからそれら__DATE____TIME__削除します。

デバッグ情報からの場合は、バイナリを通過させた後にバイナリを比較しますstrip -g

ベンダーリンカー拡張からの場合は、そのようなタイムスタンプを無効にするフラグがあるかどうかを確認してください。ない場合は、関心のある部分のみを比較するツールを作成する必要があります。たとえば、セクションreadelf -x.text a.outのみを比較するために、などを使用できます( 、、、およびおそらく多くの部分も比較する必要があります)その他)。.text.data.rodata

于 2012-06-06T03:09:19.167 に答える