2012-02-16 12 views
5

Qui ho un file eseguibile senza conoscere il suo ambiente di build, con l'assunzione di gcc/g ++ in uso. C'è un modo per scoprire il flag di ottimizzazione usato durante la compilazione (come O0, O2, ...)?Trova il flag di ottimizzazione della compilazione dall'eseguibile

Tutti i mezzi sono ben accetti, non importa che sia analizzando il binario o qualche test di debug tramite gdb (se assumiamo che -g flag sia disponibile durante la compilazione).

+0

Questa domanda può aiutare: http://stackoverflow.com/questions/189350/detect-gp-compile-time-flags-of-a-binary – Nick

+3

Sarei molto interessato al motivo di tale richiesta. In particolare, dovresti sapere che le ottimizzazioni possono essere attivate e disattivate su base individuale e che i livelli "O" sono solo gruppi per comodità. –

+1

In particolare, vedere [questa risposta informativa] (http://stackoverflow.com/a/340828/15416) a questa domanda. Questa è la prova definitiva che non puoi farlo in modo affidabile. – MSalters

risposta

-4

Probabilmente non vuoi farlo.

Pensaci ... vuoi utilizzare il codice che modifica il comportamento in base alle opzioni di ottimizzazione utilizzate per compilarlo?

In caso contrario - perché vorresti scriverlo?

+3

Non risponde alla Q, nel migliore dei casi un commento. –

+0

Penso che voglia dire che ha un eseguibile che vuole investigare. – MByD

+1

No, non risponde alla domanda. Ma pensaci: le ottimizzazioni non dovrebbero cambiare il comportamento del programma, giusto? Sembra che voglia fare proprio questo ... – jakob

2

Se si è fortunati, la riga di comando è presente nel file eseguibile stesso, a seconda del sistema operativo e del formato di file utilizzati. Se si tratta di un file Elf, provare a scaricare il contenuto utilizzando il objdump da GNU binutils

0

Non so davvero se questo può essere d'aiuto, ma il controllo di O0 è abbastanza semplice nel disassemblaggio (objdump -d), dal momento che il il codice generato non ha alcuna ottimizzazione e aggiunge alcune istruzioni per semplificare il debug.

In genere su un x86, il prologo di una funzione include il salvataggio del puntatore dello stack (per il backtrace, presumo). Quindi, se si individua, ad esempio, la funzione principale, si dovrebbe vedere qualcosa di simile:

... principale: ... spingere% rbp ... mov% RSP,% rbp

E voi dovrebbe vedere questo "modello" in quasi ogni inizio delle funzioni. Per altri target (non so quale sia la tua piattaforma di destinazione), dovresti vedere sequenze di assemblaggio più o meno simili nei prologhi o prima delle chiamate di funzione.

Per altri livelli di ottimizzazione, le cose sono molto più difficili.

Ci scusiamo per il fatto di rimanere vaghi e di non rispondere all'intera domanda ... Spero solo che sia d'aiuto.

Problemi correlati