2011-09-02 19 views
5

Uso le funzioni nude per correggere parti di un programma mentre è in esecuzione. Posso farlo facilmente in VC++ in Windows. Sto cercando di farlo in Linux e sembra che gcc non supporti le funzioni nude. La compilazione del codice con funzioni nude mi dà questo: avvertenza: la direttiva attributo 'naked' ignorata. Compilato in CentOS 5.5 i386.Perché gcc non supporta le funzioni nude?

+1

Quale versione di GCC? –

+0

Questa sembra essere una caratteristica particolare di VC: http://msdn.microsoft.com/en-us/library/21d5kd3a(v=vs.80).aspx – JohnTortugo

risposta

4

L'attributo nuda è supportato solo da GCC su alcune piattaforme (ARM, AVR, mCore, RX e SPU) secondo la docs:

naked: Utilizzare questo attributo ARM, AVR , Le porte MCORE, RX e SPU su indicano che la funzione specificata non ha bisogno di sequenze prologue/epilogo generate dal compilatore. Spetta al programmatore di fornire queste sequenze. Le sole affermazioni che possono essere tranquillamente protette da incluse nelle funzioni naked sono istruzioni asm che non hanno gli operandi . Tutte le altre dichiarazioni, comprese le dichiarazioni delle variabili locali , se le istruzioni e così via, devono essere evitate. Le funzioni Naked devono essere utilizzate per implementare il corpo di una funzione del gruppo, consentendo al compilatore di costruire la dichiarazione di funzione necessaria per l'assemblatore.

Non so perché.

+0

Perché è necessario utilizzare solo istruzioni asm che don ' t hanno operandi? Non tutti i comandi hanno comandi (anche cose come 'jmp' accettano un operando)? –

+4

@Seth: le istruzioni utilizzate nel codice assemblatore possono avere operandi, ma una "istruzione asm" non significa l'istruzione assembler, è l'intero 'asm (" alcuni insns ": outputblah: inputblah: clobberblah);'. I "blah" sono gli operandi dell'istruzione asm, ed è ciò che non puoi usare se non hai il prologo generato dal compilatore. Puoi scrivere assemblatore, ma non puoi collegarlo alle variabili C. –

+0

@Steve oh ok ho capito, grazie. –

1

GCC supporta solo funzioni nude su ARM e altre piattaforme incorporate. http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html

Inoltre, ciò che si sta facendo è intrinsecamente pericoloso, in quanto non è possibile garantire che il codice che si sta applicando non sia in esecuzione se il programma è in esecuzione.

2

Questa è una brutta soluzione. Collegamento a un file .asm per l'architettura di destinazione.

0

Su x86 è possibile aggirare utilizzando ASM in ambito globale, invece:

int write(int fd, const void *buf, int count);            

asm                    
(                    
".global write        \n\t"          
"write:         \n\t" 
"  pusha        \n\t"          
"  movl $4, %eax     \n\t"          
"  movl 36(%esp), %ebx    \n\t"          
"  movl 40(%esp), %ecx    \n\t"          
"  movl 44(%esp), %edx    \n\t"          
"  int $0x80      \n\t"          
"  popa        \n\t"          
"  ret        \n\t"          
);                    

void _start()                  
{                     
#define w(x) write(1, x, sizeof(x));            
    w("hello\n");                 
    w("bye\n");                 
}                     

anche naked è elencato tra x86 function attributes, quindi suppongo che funziona per più nuovo gcc.

Problemi correlati