Tôi sử dụng chức năng khỏa thân để vá các phần của chương trình trong khi chương trình đang chạy. Tôi có thể dễ dàng làm điều này trong VC + + trong Windows. Tôi đang cố gắng để làm điều này trong Linux và có vẻ như gcc không hỗ trợ chức năng khỏa thân. Việc biên dịch mã bằng các hàm khỏa thân cho tôi điều này: cảnh báo: chỉ thị thuộc tính ‘naked’ bị bỏ qua. Biên dịch theo CentOS 5.5 i386.Tại sao gcc không hỗ trợ chức năng khỏa thân?
Trả lời
Thuộc tính trần truồng chỉ được hỗ trợ bởi GCC trên nền tảng nhất định (ARM, AVR, MCORE, RX và SPU) theo docs:
naked
: Sử dụng thuộc tính này trên ARM, AVR , MCORE, RX và SPU cổng để chỉ ra rằng các chức năng quy định không cần mở đầu/epilogue trình tự tạo ra bởi trình biên dịch. Việc lập trình viên là sẽ cung cấp các trình tự này. Các câu lệnh duy nhất có thể an toàn được bao gồm trong các hàm khỏa thân là các câu lệnh asm không có các toán hạng . Tất cả các tuyên bố khác, bao gồm tuyên bố của các biến số địa phương , nếu có, và vv, nên tránh. Naked chức năng nên được sử dụng để thực hiện cơ thể của một chức năng lắp ráp , trong khi cho phép trình biên dịch để xây dựng các yêu cầu chức năng khai báo cho lắp ráp.
Tôi không chắc chắn lý do.
Tại sao bạn chỉ cần sử dụng câu lệnh asm mà don ' t có toán hạng? Không phải tất cả các lệnh đều có toán hạng (ngay cả những thứ như 'jmp' có toán hạng)? –
@Seth: các hướng dẫn được sử dụng trong mã assembler có thể có toán hạng, nhưng "tuyên bố asm" không có nghĩa là lệnh assembly, đó là toàn bộ 'asm (" some insns ": outputblah: inputblah: clobberblah);'. "Blahs" là các toán hạng của câu lệnh asm, và đó là những gì bạn không thể sử dụng nếu bạn không có phần mở đầu do trình biên dịch tạo ra. Bạn có thể viết assembly, nhưng bạn không thể hook nó lên các biến C. –
@Steve oh ok Tôi hiểu rồi, cảm ơn. –
GCC chỉ hỗ trợ các chức năng trần truồng trên ARM và các nền tảng nhúng khác. http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html
Ngoài ra, những gì bạn đang làm vốn đã không an toàn, vì bạn không thể đảm bảo rằng mã bạn đang vá không thực thi nếu chương trình đang chạy.
Đó là giải pháp xấu. Liên kết với một tệp .asm cho kiến trúc đích của bạn.
Trên x86 bạn có thể workaround bằng asm ở phạm vi toàn cầu thay vì:
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");
}
Cũng naked
nằm trong danh sách x86 function attributes, vì vậy tôi cho rằng nó hoạt động cho gcc mới hơn.
- 1. C++ sử dụng chức năng khỏa thân
- 2. Đối tượng khỏa thân. Tốt hay xấu
- 3. MySQL không hỗ trợ chức năng đệ quy? tại sao? Kể từ khi?
- 4. Tại sao GCC giữ các chức năng trống?
- 5. Có chức năng `printk()` hỗ trợ `va_list` không?
- 6. 'Điều khoản nơi khỏa thân' là gì?
- 7. GCC có hỗ trợ lâu dài không?
- 8. Tại sao không phân công hỗ trợ mở rộng ba kỳ của GCC?
- 9. Có hỗ trợ opencl Chức năng Con trỏ không?
- 10. Dart có hỗ trợ lập trình chức năng không?
- 11. Chức năng không được hỗ trợ từ hibernate
- 12. Tại sao F # không hỗ trợ các lớp lồng nhau?
- 13. Tại sao Arguments dài hỗ trợ Array.Copy
- 14. Chức năng của iPhone SDK Objective C có hỗ trợ các chức năng bên trong các chức năng không?
- 15. thiết kế một Hàng đợi hỗ trợ chức năng getMedian
- 16. Tại sao mảng hỗ trợ IList?
- 17. GCC sẽ hỗ trợ C++ AMP
- 18. GCC có hỗ trợ các tệp lệnh
- 19. Hỗ trợ chức năng UNION trong BigQuery SQL
- 20. Tại sao SQL Server CE không hỗ trợ VARCHAR?
- 21. Tại sao ObservableCollection không hỗ trợ thay đổi hàng loạt?
- 22. Tại sao Convert.ToDouble (char) không được hỗ trợ?
- 23. Tại sao auto_ptr không hỗ trợ op -> *()
- 24. Tại sao Java không hỗ trợ cưỡng chế và autoboxing?
- 25. Tại sao đặt chức năng?
- 26. Ngôn ngữ chức năng & hỗ trợ cho việc ghi nhớ
- 27. Cách chặn tải lên hình ảnh khỏa thân?
- 28. Gcc có hỗ trợ int 128 bit trên amd64 không?
- 29. GCC 4.0: "không có chức năng phù hợp để gọi" trong chức năng mẫu
- 30. Tại sao GCC không nhất quán về việc phát ra cảnh báo cho các chức năng không khai báo?
Phiên bản GCC nào? –
Điều này có vẻ là một tính năng cụ thể của VC: http://msdn.microsoft.com/en-us/library/21d5kd3a(v=vs.80).aspx – JohnTortugo