2011-09-02 62 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。

相關問題