我使用裸函數來修補正在運行的程序部分。我可以在Windows中使用VC++輕鬆完成此操作。我試圖在Linux中這樣做,似乎gcc不支持裸功能。用裸函數編譯代碼給了我這個:warning:忽略'naked'屬性指令。在CentOS 5.5 i386下編譯。gcc爲什麼不支持裸函數?
回答
裸屬性由在某些平臺上(ARM,AVR,MCORE,RX和SPU)GCC根據docs僅支持:
naked
: 使用對ARM,AVR該屬性,MCORE,RX和SPU端口至 表示指定的功能不需要由編譯器生成的序列/尾部 序列。程序員應該由 提供這些序列。包含在裸函數中的唯一可以安全使用 的語句是沒有 操作數的asm語句。應避免所有其他聲明,包括聲明本地 變量,if語句等等。函數應該用於實現函數的主體函數,同時允許編譯器爲彙編器構造必要的函數聲明 。
我不知道爲什麼。
爲什麼你只需要使用asm語句,沒有操作數?幾乎所有的命令都沒有操作數(甚至像'jmp'這樣的東西需要一個操作數)? –
@Seth:彙編代碼中使用的指令可以有操作數,但是「彙編語句」並不意味着彙編指令,而是整個'asm(「一些insns」:outputblah:inputblah:clobberblah);'。 「blahs」是asm語句的操作數,如果沒有編譯器生成的序言,那就是你不能使用的。您可以編寫彙編程序,但不能將其掛接到C變量。 –
@Steve oh ok我明白了,謝謝。 –
GCC只支持ARM和其他嵌入式平臺的裸機功能。 http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html
此外,你在做什麼本質上是不安全的,因爲你不能保證你正在修補的代碼在程序運行時沒有執行。
這是一個醜陋的解決方案。鏈接到目標體系結構的.asm文件。
在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。
- 1. 爲什麼GCC會說「不再支持命名的返回值」?
- 2. 爲什麼數字不支持.dup?
- 3. 爲什麼python ECDSA不支持負數?
- 4. 爲什麼Azure SQL DW不支持Error_Line()函數?
- 5. 爲什麼Clojure不支持宏中的私有函數?
- 6. MySQL不支持遞歸函數?爲什麼?從何時起?
- 7. 爲什麼mxml不支持組件構造函數?
- 8. 爲什麼std :: queue不支持clear()函數?
- 9. 爲什麼Python builin sum()函數不支持字符串?
- 10. Git - 裸回購不能爲主分支工作樹 - 爲什麼?
- 11. 什麼瀏覽器支持函數_now()?
- 12. 什麼C++ OpenCV庫支持`threshold`函數?
- 13. 爲什麼GCC是complaing約gets()函數
- 14. 對於裸SWF文件,支持什麼瀏覽器?
- 15. 支持strerrorlen_s和strerror_s函數的gcc/glibc的最早版本是什麼?
- 16. GCC錯誤信息「錯誤:不支持`mov'」是什麼意思?
- 17. gcc 4.x不支持x87 FPU數學?
- 18. 爲什麼Tomcat支持Hibernate?
- 19. 爲什麼hbase不支持bzip2壓縮?
- 20. 爲什麼memcached不支持「多套」
- 21. 爲什麼Relational Database不支持Hadoop?
- 22. 爲什麼java不支持多繼承?
- 23. 爲什麼Java不支持多繼承?
- 24. 爲什麼Decimal不支持高雙打?
- 25. ParseKit語法不支持「allowedGroupingSeparator」。爲什麼?
- 26. 爲什麼Silverlight不支持BMP/JPEG/PNGBitmapEncoder?
- 27. 爲什麼C#不支持多繼承?
- 28. 爲什麼不WsHttpBinding的支持流?
- 29. 爲什麼C不支持繼承?
- 30. 爲什麼Silverlight不支持Cursors.SizeAll?
什麼版本的GCC? –
這似乎是VC的一個特殊功能:http://msdn.microsoft.com/en-us/library/21d5kd3a(v=vs.80).aspx – JohnTortugo