2012-04-11 11 views
8

Ho bisogno di rebase il gruppo di file DLL che installo con il mio programma, perché è un programma a 32 bit e lo spazio degli indirizzi è troppo frammentato in questo momento. Inoltre, esiste il problema dell'intera DLL che viene richiesta nella pagina di RAM in un avvio a freddo in modo che il caricatore possa rebaseli, a causa di conflitti di indirizzi di base con alcune DLL. Alcune DLL sono quelle che abbiamo compilato; altri sono di terze parti.Qual è la sostituzione di REBASE.EXE?

Quello che mi piacerebbe fare è avere uno strumento rebase a un determinato set di DLL in modo che il gruppo di DLL occupi un blocco contiguo di memoria. Questo strumento verrebbe quindi eseguito appena prima della compilazione del programma di installazione e le DLL rebased verrebbero installate nella directory privata dell'applicazione.

Da quello che ho capito, lo strumento REBASE.EXE incluso in Windows SDK fa esattamente questo. Dagli alcune DLL e le ridimensiona.

Purtroppo ... Windows Software Development Kit (SDK) for Windows 8 Consumer Preview dice:

Strumenti Molti strumenti obsoleti o obsoleti sono stati rimossi da Windows SDK. I seguenti strumenti sono stati rimossi:

< snip> Rebase.exe

E adesso? Non voglio iniziare a utilizzare uno strumento apparentemente obsoleto e che andrà via nella prossima versione di Windows. Supponendo che sto leggendo questo diritto, qual è la sostituzione per l'utilizzo di ReBase.exe? Vorrei limitarmi a utilizzare gli strumenti forniti con Windows SDK e/o Visual Studio, piuttosto che introdurre strumenti di terze parti e/o scrivere il mio codice di rebase.

Oppure, sto affrontando l'intero problema nel modo sbagliato?

+1

È possibile continuare a utilizzare rebase. Funziona ancora e non smetterà di funzionare. –

+0

@DavidHeffernan: smetterà di funzionare nel momento in cui iniziamo a utilizzare l'SDK di Windows 8, secondo quel readme - perché non sarà lì, corretto? –

+1

Inoltre, non sono stato in grado di trovare la documentazione per REBASE.EXE su msdn.microsoft.com. Qualche link per questo? –

risposta

10

editbin.exe fornito con VS2010 e con opzione/REBASE.

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC>editbin 
Microsoft (R) COFF/PE Editor Version 10.00.40219.01 
Copyright (C) Microsoft Corporation. All rights reserved. 

usage: EDITBIN [options] [files] 

    options: 

     /ALLOWBIND[:NO] 
     /ALLOWISOLATION[:NO] 
     /BIND[:PATH=path] 
     /DYNAMICBASE[:NO] 
     /ERRORREPORT:{NONE|PROMPT|QUEUE|SEND} 
     /HEAP:reserve[,commit] 
     /LARGEADDRESSAWARE[:NO] 
     /NOLOGO 
     /NXCOMPAT[:NO] 
     /REBASE[:[BASE=address][,BASEFILE][,DOWN]] 
     /RELEASE 
     /SECTION:name[=newname][,[[!]{CDEIKOMPRSUW}][A{1248PTSX}]] 
     /STACK:reserve[,commit] 
     /SUBSYSTEM:{BOOT_APPLICATION|CONSOLE|EFI_APPLICATION| 
        EFI_BOOT_SERVICE_DRIVER|EFI_ROM|EFI_RUNTIME_DRIVER| 
        NATIVE|POSIX|WINDOWS|WINDOWSCE}[,#[.##]] 
     /SWAPRUN:{[!]CD|[!]NET} 
     /TSAWARE[:NO] 
     /VERSION:#[.#] 

E come Mark sottolinea ti consigliamo di disattivare ASLR, che si può fare utilizzando /DYNAMICBASE:no

+2

L'opzione EDITBIN/REBASE fa bene il trucco. E MSDN mostra che ha documentazione per EDITBIN in Visual Studio 11, quindi non vedo che rimuovono questo in qualunque momento presto. È ovvio perché stanno deprecando e rimuovendo REBASE.EXE dall'SDK di Windows 8: duplica la funzionalità di EDITBIN! Non sono sicuro del motivo per cui gli altri pensano che la necessità di rebase sia completamente obsoleta ... - non lo è. Peccato che molte delle esercitazioni di ribasso online rimandino ancora a REBASE.EXE ... –

+2

toobin editbin non genera output dettagliato come rebase.exe – deltanine

3

La ragione per cui Rebase.exe è deprecato è che non è così utile come un tempo. A partire da Windows Vista, Microsoft ha implementato Address Space Layout Randomization che sposta le DLL di sistema in giro ogni volta che vengono caricate e facoltativamente anche le DLL degli utenti.

Se stai contando su rebasing per generare un ampio spazio per gli indirizzi contigui, rimarrai deluso.

+1

Alcuni dei nostri clienti utilizzano Windows XP, che non dispone di ASLR. Le DLL compilate non sono abilitate per ASLR, quindi non caricheranno con ASLR anche su un sistema operativo ASLR come Vista/7. (Non sto manomettendo le DLL di sistema, che si trovano in uno spazio ragionevolmente contiguo - anche su Windows 7 con ASLR). –

+2

@James: se hai come target Windows XP, un sistema operativo obsoleto/obsoleto, è perfettamente logico utilizzare gli strumenti obsoleti/obsoleti da Windows SDK. Questo è ciò che David sta cercando di dirti nei commenti alla domanda. –

+3

Questo commento è molto vecchio, ma per i visitatori futuri, @AdrianMcCarthy non è corretto. Le DLL basate su consecutive non sono garantite per il caricamento consecutivo. –

3

Senza contare l'uso di "Rebase.exe -b 0x58000000 -e 0x10000 -c coffbase.txt * .dll "contro un insieme di file, semplicemente per generare il file COFFBASE.
In altre parole, non perché intendi effettivamente rebase i tuoi file ora, ma perché vuoi un COFFBASE.TXT accurato,
in modo che siano/già/siano costruiti con un indirizzo di base specifico e non conflittuale ogni volta che sono costruito.