프로그램이 실행되는 동안 프로그램의 일부를 패치하는 데 naked 함수를 사용합니다. VC++에서 Windows에서이 작업을 쉽게 수행 할 수 있습니다. 리눅스에서이 일을하려고하는데 gcc가 알몸 함수를 지원하지 않는 것 같습니다. 알몸 함수로 코드를 컴파일하면 다음과 같은 결과를 얻을 수 있습니다. 경고 : 'naked'속성 지시문이 무시됩니다. CentOS 5.5 i386에서 컴파일되었습니다.gcc가 알몸 함수를 지원하지 않는 이유는 무엇입니까?
답변
적나라한 속성 만 docs에 따라 특정 플랫폼 (ARM, AVR, 엠 코어, RX와 SPU)에 GCC에 의해 지원됩니다
naked
을 : 사용에게 ARM, AVR에이 속성을 , MCORE, RX 및 SPU 포트를 으로 지정하면 지정된 기능에 컴파일러에서 생성 된 프롤로그/에필로그 시퀀스가 필요하지 않음을 나타냅니다. 이러한 시퀀스를 제공하는 것은 프로그래머의 몫입니다 ( ). 안전한 함수로 포함 된 문은 피연산자가없는 asm 문입니다. 로컬 변수, if 문 등의 선언을 포함하여 다른 모든 문은 피해야합니다. Naked 함수는 어셈블리 함수의 본문을 구현하는 데 사용되어야하며 컴파일러는 어셈블러에 대한 필수적인 함수 선언을 구성 할 수 있어야합니다.
이유가 확실하지 않습니다.
왜 당신은 ' 피연산자가 있습니까? 거의 모든 명령어가 피연산자를 가지고 있지는 않습니다 (심지어'jmp' 같은 것이 피연산자를가집니다)? –
@Seth : 어셈블러 코드에서 사용 된 명령어는 피연산자를 가질 수 있지만 "asm 문"은 어셈블러 명령어를 의미하지 않으며 전체 asm ("some insns": outputblah : inputblah : clobberblah);입니다. "blahs"는 asm 문의 피연산자이며 컴파일러에서 생성 한 프롤로그가없는 경우 사용할 수 없습니다. 어셈블러를 작성할 수는 있지만 C 변수에 연결할 수는 없습니다. –
@ 스티브 오 오케이. 고마워. 고마워. –
GCC는 ARM 및 기타 내장 플랫폼에서 기본 기능 만 지원합니다. http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html
또한 프로그램이 실행중인 경우 패치중인 코드가 실행되지 않는다고 보장 할 수 없으므로 본질적으로 안전하지 않습니다.
그건 못생긴 해결책입니다. 대상 아키텍처에 대한 .asm 파일에 연결하십시오. 대신 전역에서 ASM을 사용하여 해결할 수 있습니다 86에
:
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");
}
는 또한 naked
이 x86 function attributes 사이에 나열됩니다, 그래서 그것이 새로운 gcc가 작동 가정합니다.
- 1. IE를 지원하지 않는 이유는 무엇입니까?
- 2. GCC가 구조체를 최적화하지 않는 이유는 무엇입니까?
- 3. 'ref'와 'out'이 다형성을 지원하지 않는 이유는 무엇입니까?
- 4. Entity Framework에서 ODBC를 지원하지 않는 이유는 무엇입니까?
- 5. 숫자가 .dup를 지원하지 않는 이유는 무엇입니까?
- 6. URLLib2에서 영구 연결을 지원하지 않는 이유는 무엇입니까?
- 7. Silverlight에서 Cursors.SizeAll을 지원하지 않는 이유는 무엇입니까?
- 8. WPF가 C++ .NET을 지원하지 않는 이유는 무엇입니까?
- 9. 표현식이 IdentityEquality를 지원하지 않는 이유는 무엇입니까?
- 10. Compact Framework에서 MDI를 지원하지 않는 이유는 무엇입니까?
- 11. 호스팅 회사에서 mod_deflate를 지원하지 않는 이유는 무엇입니까?
- 12. GCC가 함수를 검색 할 때 개인 생성자를 보는 이유는 무엇입니까?
- 13. gcc가 const int를 대문자로 허용하지 않는 이유는 무엇입니까?
- 14. gcc가 클래스 선언을 참조 인수로 컴파일하지 않는 이유는 무엇입니까?
- 15. Perl이 문자열을 색인화하기 위해 일반 [] 연산자를 지원하지 않는 이유는 무엇입니까?
- 16. stl이 함수를 멤버로 비교하지 않는 이유는 무엇입니까?
- 17. IntelliSense가 VB.NET과 비교할 때 C#을 지원하지 않는 이유는 무엇입니까?
- 18. C#에서 선택적/기본 인수를 지원하지 않는 이유는 무엇입니까?
- 19. AutoResetEvent 및 ManualResetEvent가 생성자에서 이름을 지원하지 않는 이유는 무엇입니까?
- 20. Silverlight가 컴파일 된 정규식을 지원하지 않는 이유는 무엇입니까?
- 21. C#이 인터페이스가있는 객체를 매개 변수로 지원하지 않는 이유는 무엇입니까?
- 22. C#이 다중 상속을 지원하지 않는 이유는 무엇입니까?
- 23. CodeIgniter 2가 모듈 식 확장을 지원하지 않는 이유는 무엇입니까?
- 24. memcached가 목록, 설정 또는 해시 테이블을 지원하지 않는 이유는 무엇입니까?
- 25. Hadoop 파일 시스템이 랜덤 I/O를 지원하지 않는 이유는 무엇입니까?
- 26. JVM이 강제 클래스/클래스 로더 언로드를 지원하지 않는 이유는 무엇입니까?
- 27. Google Collections가 Apache Collections와 같은 MultiKeyMap을 지원하지 않는 이유는 무엇입니까?
- 28. Eclipse 코드가 특정 항목을 지원하지 않는 이유는 무엇입니까?
- 29. Objective-C가 메서드 오버로딩을 지원하지 않는 이유는 무엇입니까?
- 30. mxml이 구성 요소 생성자를 지원하지 않는 이유는 무엇입니까?
GCC의 버전은 무엇입니까? –
이것은 VC의 특정 기능인 것 같습니다 : http://msdn.microsoft.com/en-us/library/21d5kd3a(v=vs.80).aspx – JohnTortugo