2011-09-02 7 views
5

프로그램이 실행되는 동안 프로그램의 일부를 패치하는 데 naked 함수를 사용합니다. VC++에서 Windows에서이 작업을 쉽게 수행 할 수 있습니다. 리눅스에서이 일을하려고하는데 gcc가 알몸 함수를 지원하지 않는 것 같습니다. 알몸 함수로 코드를 컴파일하면 다음과 같은 결과를 얻을 수 있습니다. 경고 : 'naked'속성 지시문이 무시됩니다. CentOS 5.5 i386에서 컴파일되었습니다.gcc가 알몸 함수를 지원하지 않는 이유는 무엇입니까?

+1

GCC의 버전은 무엇입니까? –

+0

이것은 VC의 특정 기능인 것 같습니다 : http://msdn.microsoft.com/en-us/library/21d5kd3a(v=vs.80).aspx – JohnTortugo

답변

4

적나라한 속성 만 docs에 따라 특정 플랫폼 (ARM, AVR, 엠 코어, RX와 SPU)에 GCC에 의해 지원됩니다

naked을 : 사용에게 ARM, AVR에이 속성을 , MCORE, RX 및 SPU 포트를 으로 지정하면 지정된 기능에 컴파일러에서 생성 된 프롤로그/에필로그 시퀀스가 ​​필요하지 않음을 나타냅니다. 이러한 시퀀스를 제공하는 것은 프로그래머의 몫입니다 ( ). 안전한 함수로 포함 된 문은 피연산자가없는 asm 문입니다. 로컬 변수, if 문 등의 선언을 포함하여 다른 모든 문은 피해야합니다. Naked 함수는 어셈블리 함수의 본문을 구현하는 데 사용되어야하며 컴파일러는 어셈블러에 대한 필수적인 함수 선언을 구성 할 수 있어야합니다.

이유가 확실하지 않습니다.

+0

왜 당신은 ' 피연산자가 있습니까? 거의 모든 명령어가 피연산자를 가지고 있지는 않습니다 (심지어'jmp' 같은 것이 피연산자를가집니다)? –

+4

@Seth : 어셈블러 코드에서 사용 된 명령어는 피연산자를 가질 수 있지만 "asm 문"은 어셈블러 명령어를 의미하지 않으며 전체 asm ("some insns": outputblah : inputblah : clobberblah);입니다. "blahs"는 asm 문의 피연산자이며 컴파일러에서 생성 한 프롤로그가없는 경우 사용할 수 없습니다. 어셈블러를 작성할 수는 있지만 C 변수에 연결할 수는 없습니다. –

+0

@ 스티브 오 오케이. 고마워. 고마워. –

1

GCC는 ARM 및 기타 내장 플랫폼에서 기본 기능 만 지원합니다. http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html

또한 프로그램이 실행중인 경우 패치중인 코드가 실행되지 않는다고 보장 할 수 없으므로 본질적으로 안전하지 않습니다.

2

그건 못생긴 해결책입니다. 대상 아키텍처에 대한 .asm 파일에 연결하십시오. 대신 전역에서 ASM을 사용하여 해결할 수 있습니다 86에

0

:

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");                 
}                     

는 또한 nakedx86 function attributes 사이에 나열됩니다, 그래서 그것이 새로운 gcc가 작동 가정합니다.

관련 문제