2011-09-02 13 views
5

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?

+1

¿Qué versión de GCC? –

+0

Esto parece ser una característica particular de VC: http://msdn.microsoft.com/en-us/library/21d5kd3a(v=vs.80).aspx – JohnTortugo

Respuesta

4

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é.

+0

¿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)? –

+4

@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. –

+0

@Steve oh ok Lo entiendo, gracias. –

1

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.

2

Esa es una solución fea. Enlace contra un archivo .asm para su arquitectura de destino.

0

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.

Cuestiones relacionadas