2009-08-03 9 views
6

私は3台のビルドマシンを持っています。 1つはWindows 2000で、もう1つはXP SP3で、もう1つは64bit Windows Server 2008で実行されています。 そして、私はVisual C++プロジェクトをビルドしています(私はVisual Studio 2005 SP1でビルドしています)。 私の目標は、これらのビルドマシンを使用して同じDLLを「正確に」構築することです。同じシステムで異なるビルド

ちょうど私が少しずつ(つまりタイムスタンプを作るのを除いて)意味しています。

win2kとwinxpでは、私は同じdllを取得しています。しかし、win2008サーバで構築されたDLLとは異なります。 私はほぼ同じdllを手に入れましたが、いくつかの違いがあります。ファイルを逆アセンブルした後、その関数の順序は同じではないことがわかりました(3つの関数は異なる順序です)。

誰でもその理由を知ることができますか?

そして、副問: vcbuild.exeでは、スイッチ/オーダーが見つかりました。関数オーダーファイルを入力として受け取ります。誰でもそのファイルの外観を知っていますか?

+0

32ビット互換モードでVSを実行しようとしましたか? – Makis

+0

32ビット互換で動作する必要があります.64ビット版のビジュアルスタジオAFAIK – ppiotrowicz

+1

はありません。1. Server 2008マシンは別のCPUで動作していますか? (私はかつて、AMDマシンがINTELとはわずかに異なる出力を生み出した、奇妙ではあるが真実の同様の問題を見たことがある)。 2.インストールされているアップデートをチェックして、VSコンポーネントが変更されていないかどうか確認しましたか? –

答えて

7

コンパイルは純粋に決定論的です(同一の入力は毎回同じ出力を与えます)が、そうである必要はありません。たとえば、オプティマイザを考えてみましょう。これは多少のメモリが必要になりますが、おそらくより高度な最適化手法が必要になります。 1つのマシン上でメモリーの割り当てが失敗した場合(マシンのメモリーが少ないため)、コンパイラーはその特定の最適化を省略して、異なるコードを生成することができます。

似たような状況が多いので、実行できないことに多くの努力を払っている可能性があります。とにかく、DLLがビット単位で同一である必要があるのはなぜですか?

+0

最適化をオフにして(/ Odスイッチ)同じ問題があります。 このプロジェクトでは、ビット単位の等価性が重要です(なぜ、どうしても申し訳ありません)。 – ppiotrowicz

+2

最適化は単なる例であり、コンパイラが異なる出力を生成する可能性のあるものがたくさんあります。 –

0

チェーンツール(コンパイラ、リンカ、など)と同じバージョンを実行しますか?32/64ビットの違いがありますか?

+0

はい、どこでもSP1を使用してvs2005をビルドしています(.net 2.0 SP1もインストールされています)。 win32プラットフォームへのビルド。 – ppiotrowicz

+0

Win2008で32ビットバージョンのコンパイラとリンカを使用していますか? – AProgrammer

+0

はい、確信しています。彼らはプログラムファイル(x86) – ppiotrowicz

0

Windows Server 2008は64ビットマシンで動作していますか?それがあなたの問題かもしれません。

+0

にあるかもしれませんが、32ビットシステムからのdllはほとんど同じです。唯一の違いは_3_関数の順序が異なることです(プロジェクトには多くの関数があります)。 逆アセンブルされたコードはほとんど同じです。 – ppiotrowicz

関連する問題