2009-08-03 16 views
6

Ho 3 macchine di costruzione. Uno in esecuzione su Windows 2000, uno con XP SP3 e uno con Windows Server a 64 bit 2008. E ho un progetto C++ nativo da compilare (sto costruendo con Visual Studio 2005 SP1). Il mio obiettivo è quello di costruire "esattamente" la stessa dll usando queste macchine di compilazione.Costruzione identica su diversi sistemi

Con precisione intendo bit per bit (ad eccezione del timestamp di build, ovviamente).

Con win2k e winxp ricevo le dll identiche. Ma differiscono da dll costruito con win2008 server. Sono riuscito a ottenere dll quasi identici, ma ci sono alcune differenze. Dopo aver smontato i file, ho scoperto che l'ordine delle funzioni non è lo stesso (3 funzioni sono in ordine diverso).

Qualcuno sa quale potrebbe essere la ragione?

E una domanda a lato: In vcbuild.exe ho trovato un interruttore/ORDINE. Che accetta come file il file di ordine delle funzioni. Qualcuno sa come dovrebbe essere quel file?

+0

Hai provato a eseguire VS in modalità di compatibilità a 32 bit (o come si chiama)? – Makis

+0

Deve essere eseguito in compat 32 bit, non esiste una versione a 64 bit di Visual Studio AFAIK – ppiotrowicz

+1

1. La macchina Server 2008 esegue una CPU diversa? (Una volta ho visto un problema simile in cui una macchina AMD ha prodotto un output leggermente diverso da INTEL, strano ma vero). 2. Avete controllato gli aggiornamenti installati per vedere se qualcosa ha cambiato componenti VS? –

risposta

7

Si potrebbe pensare che la compilazione sia puramente deterministica (gli input identici forniscono output identici, ogni volta) ma non è necessario. Ad esempio, prendi in considerazione l'ottimizzatore: questo richiederà un po 'di memoria, probabilmente più per metodi di ottimizzazione più elevati. Se su una macchina l'allocazione di memoria fallisce (perché la macchina ha meno memoria), il compilatore potrebbe omettere quella ottimizzazione specifica, con conseguente emissione di codice diverso.

Ci sono molte situazioni simili, quindi potresti mettere molto impegno in qualcosa che non è fattibile. Perché hai bisogno che le DLL siano identiche per bit, comunque?

+0

Con le ottimizzazioni disattivate (/ Inoltro) ho lo stesso problema. L'equità per bit è cruciale in questo progetto (non si può davvero discutere perché, scusa). – ppiotrowicz

+2

L'ottimizzazione era solo un esempio: ci sono molte cose che potrebbero far sì che il compilatore produca output diversi. –

0

Esegui la stessa versione dello strumento catena (compilatore, linker, ...), inclusa la differenza 32/64 bit?

+0

Sì, sto costruendo ovunque con vs2005 con SP1 (è installato anche .net 2.0 SP1). Edificio per piattaforma win32. – ppiotrowicz

+0

Sei sicuro di utilizzare la versione a 32 bit del compilatore e il linker su Win2008? – AProgrammer

+0

Sì, sono sicuro. Sono in Program Files (x86) – ppiotrowicz

0

Windows Server 2008 è l'unica macchina in esecuzione a 64 bit? Se lo è, potrebbe essere il tuo problema.

+0

Potrebbe essere, ma le DLL da sistemi a 32 bit sono quasi identiche. L'unica differenza è che _3_ funzioni sono in ordine diverso (e ci sono molte funzioni nel progetto). Il codice disassemblato è quasi lo stesso. – ppiotrowicz

Problemi correlati