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?
risposta
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é.
Perché è necessario utilizzare solo istruzioni asm che don ' t hanno operandi? Non tutti i comandi hanno comandi (anche cose come 'jmp' accettano un operando)? –
@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. –
@Steve oh ok ho capito, grazie. –
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.
Questa è una brutta soluzione. Collegamento a un file .asm per l'architettura di destinazione.
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.
- 1. Perché C11 non supporta le funzioni lambda
- 2. MySQL non supporta le funzioni ricorsive? perché? da quando?
- 3. Utilizzando l'attributo "nudo" per funzioni in GCC
- 4. Perché ObservableCollection non supporta le modifiche collettive?
- 5. GCC supporta C++ AMP
- 6. QMap supporta le funzioni di confronto personalizzate?
- 7. iPhone SDK Objective C supporta le funzioni all'interno delle funzioni?
- 8. Perché Microsoft.NETCore.App non supporta netstandard1.6?
- 9. Funzioni inline C++ tramite GCC - perché la CHIAMATA?
- 10. Rendi warn_unused_result applicato a tutte le funzioni con GCC
- 11. Perché Java non supporta le strutture? (Solo per curiosità)
- 12. Perché Windows Phone 7 non supporta pienamente le specifiche C#?
- 13. Perché javascript non supporta meglio i cookie e le querystring?
- 14. Perché utilizzare le funzioni virtuali?
- 15. g ++ come verificare se supporta le funzioni lambda?
- 16. Rust supporta le funzioni che restituiscono più valori?
- 17. Come far sì che gcc avvisi le funzioni sconosciute?
- 18. Come rendere GCC valutare le funzioni in fase di compilazione?
- 19. Il GCC supporta long long int?
- 20. Perché XmlSerializer non supporta il dizionario?
- 21. Perché Kotlin non supporta "operatore ternario"
- 22. Come bloccare i caricamenti di immagini nude?
- 23. Perché GCC non mostra informazioni di vettorizzazione?
- 24. Perché le funzioni nidificate di Python non sono chiamate chiusure?
- 25. Perché non c'è nessuna istanza per le funzioni?
- 26. Perché Java `BitSet` non ha le funzioni` shiftLeft` e `shiftRight`?
- 27. Perché gli attributi PHP non consentono le funzioni?
- 28. Perché le funzioni non sono disponibili nell'oggetto globale?
- 29. Perché constexpr non è l'impostazione predefinita per tutte le funzioni?
- 30. Perché JSON.stringify non visualizza le proprietà dell'oggetto che sono funzioni?
Quale versione di GCC? –
Questa sembra essere una caratteristica particolare di VC: http://msdn.microsoft.com/en-us/library/21d5kd3a(v=vs.80).aspx – JohnTortugo