Uso las funciones desnudas para parchar partes de un programa mientras se está ejecutando. Puedo hacer esto fácilmente en VC++ en Windows. Estoy intentando hacer esto en Linux y parece que gcc no admite funciones desnudas. La compilación de código con funciones desnudas me da esto: warning: directiva de atributo 'naked' ignorada. Compilado bajo CentOS 5.5 i386.¿Por qué gcc no admite funciones desnudas?
Respuesta
El atributo desnudo sólo es compatible con GCC en ciertas plataformas (ARM, AVR, MCORE, RX y SPU) de acuerdo con la docs:
naked
: utilizar este atributo en el brazo, AVR , Los puertos MCORE, RX y SPU a indican que la función especificada no necesita secuencias de prólogo/epílogo generadas por el compilador. Depende del programador a proporcionar estas secuencias. Las únicas declaraciones que pueden ser seguras incluidas en funciones simples son declaraciones asm que no tienen operandos. Deben evitarse todas las demás declaraciones, incluidas las declaraciones de las variables locales , las declaraciones if, etc. Las funciones Naked se deben utilizar para implementar el cuerpo de una función de ensamblaje , al tiempo que permite al compilador crear la declaración de función requerida para el ensamblador.
No estoy seguro de por qué.
¿Por qué necesita usar solo sentencias asm que no funcionan? ¿Tienes operandos? ¿No casi todos los comandos tienen operandos (incluso cosas como 'jmp' toman un operando)? –
@Seth: las instrucciones utilizadas en el código ensamblador pueden tener operandos, pero una "instrucción asm" no significa la instrucción ensamblador, es el conjunto 'asm (" algunos insns ": outputblah: inputblah: clobberblah);'. Los "blahs" son los operandos de la sentencia asm, y eso es lo que no puedes usar si no tienes el prólogo generado por el compilador. Puede escribir el ensamblador, pero no puede conectarlo a las variables C. –
@Steve oh ok Lo entiendo, gracias. –
GCC solo admite funciones desnudas en ARM y otras plataformas integradas. http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html
Además, lo que estás haciendo es intrínsecamente inseguro, ya que no puedes garantizar que el código que estás aplicando no se esté ejecutando si el programa se está ejecutando.
Esa es una solución fea. Enlace contra un archivo .asm para su arquitectura de destino.
en x86 se puede solucionar mediante el uso de ASM en el ámbito mundial en su lugar:
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");
}
también naked
se recuerda, entre x86 function attributes, así que supongo que funciona para nuevo GCC.
- 1. ¿Por qué GCC mantiene las funciones vacías?
- 2. C++ funciones en línea usando GCC - ¿por qué la LLAMADA?
- 3. ¿Por qué ObservableCollection no admite cambios masivos?
- 4. ¿Por qué F # no admite clases anidadas?
- 5. ¿Por qué auto_ptr no admite op -> *()
- 6. ¿Por qué XmlSerializer no admite el diccionario?
- 7. ¿Por qué wsHttpBinding no admite la transmisión?
- 8. ¿Por qué Java varargs no admite colecciones?
- 9. ¿Por qué no se admite Convert.ToDouble (char)?
- 10. Usando el atributo "desnudo" para las funciones de GCC
- 11. ¿Por qué GCC no optimiza las estructuras?
- 12. ¿por qué la sobrecarga no admite en Actionscript?
- 13. ¿Por qué MySQL no admite milisegundos/microsegundos de precisión?
- 14. ¿Por qué GCC es inconsistente sobre emitir advertencias para funciones no declaradas?
- 15. ¿Por qué el uso de boost :: tuple's .get no funciona en funciones de plantilla en gcc?
- 16. ¿Por qué Scheme no admite entornos de primera clase?
- 17. ¿Admite GCC los archivos de comando
- 18. ¿Por qué CSS no admite el relleno negativo?
- 19. ¿Por qué no se admite multitarea en el iPhone?
- 20. ¿Por qué el Data.Set de Haskell no admite conjuntos infinitos?
- 21. ¿Por qué `getattr` no admite recuperaciones consecutivas de atributos?
- 22. ¿Por qué WCF no admite tiempos de espera de servicio?
- 23. ¿Por qué C++ no admite varios inicializadores en for loop?
- 24. ¿Por qué IIS no admite la codificación de transferencia fragmentada?
- 25. ¿Por qué Java Generics no admite tipos primitivos?
- 26. ¿Por qué mxml no admite constructores de componentes?
- 27. ¿GCC captura incorrectamente variables globales por referencia en funciones lambda?
- 28. ¿Por qué Scala admite variables ocultas?
- 29. ¿Por qué GCC no auto-vectorizará este ciclo?
- 30. ¿Por qué no puedo encontrar gcc mi biblioteca estática?
¿Qué versión de GCC? –
Esto parece ser una característica particular de VC: http://msdn.microsoft.com/en-us/library/21d5kd3a(v=vs.80).aspx – JohnTortugo