.aアーカイブ形式のヘッダーにはタイムスタンプが必要です。これは、主に元のバイナリを正確に再現できないために、静的ライブラリを再構築するときに数え切れないほどの頭痛の種になりました。
たとえば(これは私のMacにありますが、x64 linuxでも同じことが起こります):
$ cat foo.h
int foo();
$ cat foo.c
#include "foo.h"
int foo() { return 3; }
$ gcc -fno-pic -m64 -arch x86_64 -I/usr/local/include -O3 -c foo.c -o foo.o -fpic
$ ar rcs libfoo.a foo.o
$ md5 libfoo.a
MD5 (libfoo.a) = 0d0e6606185de4e994c47f4a0e54c1c4
$ mv libfoo.a libfoo.a1
$ ar rcs libfoo.a foo.o
$ md5 libfoo.a
MD5 (libfoo.a) = 22a69d42e1325ae8f978c2a18a4886da
唯一の違いが時間であることを自分自身に証明するために、私はhexdumpに基づいて差分を取りました。
$ diff <(hexdump libfoo.a) <(hexdump libfoo.a1)
2,3c2,3
< 0000010 20 20 20 20 20 20 20 20 31 33 31 31 30 34 33 30
< 0000020 38 36 20 20 35 30 31 20 20 20 32 30 20 20 20 20
---
> 0000010 20 20 20 20 20 20 20 20 31 33 31 31 30 34 32 38
> 0000020 37 31 20 20 35 30 31 20 20 20 32 30 20 20 20 20
これは、ヘッダー形式を使用してバックソルブする場合、時間フィールドに対応します。
マンページには、ヘッダーのタイムスタンプを上書きできるかどうかは示されていません。何かご意見は?
編集:はい、任意のタイムスタンプを使用するために戻ってファイルを物理的にハッキングすることは可能です。はい、プログラムの動作を変更することは可能です。状況を取り巻く状況を考えると、そのすべてが本質的に厳密に技術的であるとは限らないため、タイムスタンプを手動で変更するツールは受け入れられず、の修正バージョンでar
も、実際のシステム時刻を台無しにすることもありません。
編集:この状況では、ビルドパスからの許容できない逸脱なしに、バイナリをソースから生成できることを証明する必要があります。一部の業界(金融など)では、これは明らかに標準的な方法です。タイムスタンプを変更するための手動ツールは使用できません(元のビルドパスになかった特別なツールが使用されたため)。のハンドロールバージョンar
は受け入れられません(同様の問題)。システムクロックを変更する際の問題は、ビルドを完全に調整する必要があることです(これは、多くのライブラリとバイナリを含む1時間のビルドです)。受け入れ可能なソリューションは次のとおりです。
- ライブラリ内のタイムスタンプを上書きする可能性のあるARまたはその他のプログラムへのフラグ
- これを行うための既存の(年齢> 1歳)ツール
- リンクを行うときにarからのタイムスタンプをオーバーライドできるGCCへのフラグ