2013-02-14 13 views
6

Ho un progetto C++ in Visual Studio 2010 che viene compilato in una DLL. Ho diverse classi specifiche per l'implementazione private definite nel mio progetto, ad es. CMyClass. Questa classe non viene esportata dalla dll o da alcuna funzione di interfaccia. Tuttavia, quando controllo il file dll generato, c'è una stringa "CMyClass" in essa contenuta. È una build di rilascio e non voglio che questa stringa appaia nel file dll. Questa DLL è spedita ai clienti, e voglio che tutti i nomi che ho usato nel mio progetto vengano rimossi dal file dll, così nessuno può avere un indizio così semplice su quali algoritmi usiamo nella nostra DLL.Rimuovere i nomi di classe C++ dal file dll binario

Uso la configurazione di rilascio. Nelle proprietà del progetto, l'opzione "Genera informazioni di debug" nella scheda del linker è disattivata, il "Formato informazioni di debug" nella scheda C/C++ è impostato su "Database del programma (/ Zi)". Ho provato a impostare la stringa vuota per "Debug Information Format" senza successo.

La stringa trovata nella dll si presenta come [email protected]@ e si trova all'estremità del file dll. È l'unica occorrenza della stringa "CMyClass" nel file dll. Tuttavia, questa stringa è presentata per quasi tutte le mie classi interne.

Come sbarazzarsi di queste menzioni?

Aggiornamento

Si prega di notare, io non voglio offuscare il codice sorgente stesso. Il link fornito è irrilevante. Non vedo alcun motivo per cui i nomi delle classi sono memorizzati nel file dll. Posso sempre rinominare le mie classi prima della compilazione, ma non è una soluzione molto semplice.

Update2

non sono d'accordo con la comunità in chiusura questo qustion, dal momento che questo non è un duplicato. E la risposta è data nei commenti dal Tyler Gill. Grazie a lui e vergogna per gli altri.

+1

http://stackoverflow.com/questions/1025494/obfuscating-cc-code – Ram

+1

"Non voglio che questa stringa appaia nel file dll" Qual è il motivo esatto per cui pensi che il nome della classe sia essere nascosto Compilare un codice C++ è già abbastanza offuscamento! – Ram

+0

@Ram Perché i nomi delle classi corrispondono ai nomi degli algoritmi che usiamo per risolvere il problema. Non vogliamo che nessuno sappia quali algoritmi utilizziamo. – Mikhail

risposta

4

Come la mia ipotesi da un commento sembra corretta, sto ripubblicando questo come risposta.

La stringa del nome classe è il risultato dell'attivazione di RTTI (Informazioni tipo runtime) per i file binari compilati. Quando RTTI è abilitato, il compilatore crea oggetti che memorizzano informazioni sui tipi compilati nel binario, una delle cui proprietà è il nome del tipo.

Nota che alcuni usi di dynamic_cast e typeid richiedono RTTI, quindi la disattivazione ti costerà quelle caratteristiche di C++.

Per disabilitare RTTI in Visual Studio, utilizzare l'interruttore /GR- (vedi http://msdn.microsoft.com/en-us/library/we6hfdy0(v=vs.100).aspx, come ha scritto Mikhail.)

per disattivarlo in GCC, usare l'interruttore -fno-rtti.

+1

Ha fatto lo stesso e ha funzionato solo per una parte dei nomi di classe. Per altri il RTTI non era abbastanza. Apparentemente quando si usa "std :: bind" con funzioni virtuali - il nome della classe può apparire nel binario anche se RTTI è disabilitato. Semplicemente non usare std :: bind (o funzione correlata) –

2

come Tyler Gill menzionato nei commenti, questa stringa è stata lasciata dal compilatore a causa di RTTI poiché CMyClass eredita effettivamente IMyClass ed è polimorfica. Il mio problema può essere facilmente risolto con disabling RTTI con lo switch /GR-. Grazie.

Problemi correlati