2011-09-02 59 views
5

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?

+1

Phiên bản GCC nào? –

+0

Đ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

Trả lời

4

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.

+0

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)? –

+4

@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. –

+0

@Steve oh ok Tôi hiểu rồi, cảm ơn. –

1

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.

2

Đó 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.

0

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.

Các vấn đề liên quan