-1

1か月前に作成された特定のプログラム用の動作中のexeファイルがあります。開発環境で誤ってexeを削除してしまったため、新しいexeをコンパイルしました。ただし、uat環境で動作しているexeのコピーがあり、そのチェックサムは新しいexeとは異なります。

2つのexeファイルのサイズは同じです。

---------- +1raymond1ドメインユーザー623616Jan3 16:47 A.EXE; 24

---------- +1raymond1ドメインユーザー623616Jan4 11:11 A.EXE; 25

しかし、彼らは異なるチェックサムを取得しました:

$ sha1sum "A.EXE;24"
cb87ec4b746677903969ba61361a60c14461b5e0 *RIIB.EXE;24
$ sha1sum "A.EXE;25"
09453f40e53e280abbb98bd0013f1ddf312706b8 *RIIB.EXE;25

ですから、新しいexeを生成する方法に問題があるのではないかと思います。おそらく、依存するプログラムをコンパイルするのを忘れているのではないでしょうか。

とにかく、バージョン25の場合とまったく同じ方法で別のexeをコンパイルしました。それでも、他の2つのexeと同じサイズになりました。もう一度リンクしました。ただし、バージョン26でもチェックサムが異なります。

$ sha1sum "RIIB.EXE;26"
e2378544a91db49927738fd0135181b9daf125be *RIIB.EXE;26

それで、私はそれらの間の違いを見つけることができるかどうか疑問に思います。

PS exeはOpenVmsで生成されたので、チェックサム用に自分のマシンにftpで転送します(WIN 7のCYGWIN)。

編集:

コメントのアドバイスに従い、バイナリ差分を実行します。

結果は次のとおりです。

$ xxd "A.EXE;24" > b24.hex
$ xxd "A.EXE;25" > b25.hex
$ xxd "A.EXE;26" > b26.hex

$ diff b24.hex b25.hex
34849,34850c34849,34850
< 0088200: 1900 0060 0000 0000 6ff8 42de 9b2c 0100  ...`....o.B..,..
< 0088210: 3500 0060 0000 0000 8c6f f842 de9b ac00  5..`.....o.B....
---
> 0088200: 1900 0060 0000 0000 62b3 87f4 cd2c 0100  ...`....b....,..
> 0088210: 3500 0060 0000 0000 0b62 b387 f4cd ac00  5..`.....b......
38862c38862
< 0097cd0: 4950 462f 564d 5300 8c6f f842 de9b ac00  IPF/VMS..o.B....
---
> 0097cd0: 4950 462f 564d 5300 0b62 b387 f4cd ac00  IPF/VMS..b......
38868c38868
< 0097d30: 0100 0000 0300 0000 8c6f f842 de9b ac00  .........o.B....
---
> 0097d30: 0100 0000 0300 0000 0b62 b387 f4cd ac00  .........b......
38872c38872
< 0097d70: 4950 462f 564d 5300 8c6f f842 de9b ac00  IPF/VMS..o.B....
---
> 0097d70: 4950 462f 564d 5300 0b62 b387 f4cd ac00  IPF/VMS..b......    

$ diff b25.hex b26.hex
34849,34850c34849,34850
< 0088200: 1900 0060 0000 0000 62b3 87f4 cd2c 0100  ...`....b....,..
< 0088210: 3500 0060 0000 0000 0b62 b387 f4cd ac00  5..`.....b......
---
> 0088200: 1900 0060 0000 0000 10a5 1c14 ce2c 0100  ...`.........,..
> 0088210: 3500 0060 0000 0000 e710 a51c 14ce ac00  5..`............
38862c38862
< 0097cd0: 4950 462f 564d 5300 0b62 b387 f4cd ac00  IPF/VMS..b......
---
> 0097cd0: 4950 462f 564d 5300 e710 a51c 14ce ac00  IPF/VMS.........
38868c38868
< 0097d30: 0100 0000 0300 0000 0b62 b387 f4cd ac00  .........b......
---
> 0097d30: 0100 0000 0300 0000 e710 a51c 14ce ac00  ................
38872c38872
< 0097d70: 4950 462f 564d 5300 0b62 b387 f4cd ac00  IPF/VMS..b......
---
> 0097d70: 4950 462f 564d 5300 e710 a51c 14ce ac00  IPF/VMS.........

同じ行に違いがあります。多分それは問題を引き起こしているタイムスタンプですか?

4

1 に答える 1

2

プログラムの機能に関する限り、まったく同じパラメーターを使用してまったく同じコードをコンパイルした場合、2つのバージョンに違いはありません(非常に奇妙なコンパイラーのバグがない限り)。コンパイラが生成した日付や時刻など、コード内の環境設定にも依存する場合があることに注意してください。これは、コンパイルごとに当然異なる可能性があります。

コンパイルの時間、環境、コンパイラのメタデータ、コンパイル中の天気の状態など、実際に生成されるバイナリに影響を与える追加の要因があるため、署名は異なります。実際、署名が同じである場合、それsha1は価値がないことを意味します。

編集:

コンパイラによって生成された定数__LINE__(たとえば、ビルド前のスクリプトが#defineコード分析ツールのコードにいくつかのsを挿入する場合があります)は、__DATE__コンパイル__TIME__ごとに変わる可能性があります。

コンパイラは、が最新であると見なす場合、一部のファイルを再コンパイルしないことを選択する場合があります.obj(特に、プリコンパイル済みヘッダーが使用されている場合は、常に正しいとは限りませんが、.exeが無効になります)。さらに、リンカは、速度や最適化、またはその他の理由により、リンケージの順序に関して内部的な考慮事項がある場合があります。

于 2013-01-04T07:13:29.357 に答える