我使用裸函数来修补正在运行的程序部分。我可以在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