2011-09-02 63 views
5

我使用裸函数来修补正在运行的程序部分。我可以在Windows中使用VC++轻松完成此操作。我试图在Linux中这样做,似乎gcc不支持裸功能。用裸函数编译代码给了我这个:warning:忽略'naked'属性指令。在CentOS 5.5 i386下编译。gcc为什么不支持裸函数?

+1

什么版本的GCC? –

+0

这似乎是VC的一个特殊功能:http://msdn.microsoft.com/en-us/library/21d5kd3a(v=vs.80).aspx – JohnTortugo

回答

4

裸属性由在某些平台上(ARM,AVR,MCORE,RX和SPU)GCC根据docs仅支持:

naked: 使用对ARM,AVR该属性,MCORE,RX和SPU端口至 表示指定的功能不需要由编译器生成的序列/尾部 序列。程序员应该由 提供这些序列。包含在裸函数中的唯一可以安全使用 的语句是没有 操作数的asm语句。应避免所有其他声明,包括声明本地 变量,if语句等等。函数应该用于实现函数的主体函数,同时允许编译器为汇编器构造必要的函数声明 。

我不知道为什么。

+0

为什么你只需要使用asm语句,没有操作数?几乎所有的命令都没有操作数(甚至像'jmp'这样的东西需要一个操作数)? –

+4

@Seth:汇编代码中使用的指令可以有操作数,但是“汇编语句”并不意味着汇编指令,而是整个'asm(“一些insns”:outputblah:inputblah:clobberblah);'。 “blahs”是asm语句的操作数,如果没有编译器生成的序言,那就是你不能使用的。您可以编写汇编程序,但不能将其挂接到C变量。 –

+0

@Steve oh ok我明白了,谢谢。 –

2

这是一个丑陋的解决方案。链接到目标体系结构的.asm文件。

0

在x86上,你可以通过在全球范围内使用ASM不是解决方法:

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。

相关问题