2011-09-24 24 views
6

Tôi đang làm việc trên một máy ảo mà tôi muốn có thể giao tiếp với C. Đi theo cách khác và hiển thị các chức năng máy ảo cho mã C là khá dễ dàng, những gì tôi không thể quấn đầu xung quanh là phơi bày C chức năng cho một máy ảo.Làm cách nào để hiển thị các hàm C cho máy ảo tùy chỉnh?

Tôi muốn để có thể tự động đăng ký chức năng C với các máy ảo như vậy:

vm_register(printf); 

Sau đó, trong máy ảo của tôi, đẩy các đối số vào stack, và:

call printf 

Vấn đề là không biết có bao nhiêu đối số mà hàm yêu cầu và loại nào, tôi không chắc chắn có thể sử dụng con trỏ hàm.

Có loại con trỏ chức năng chung nào có thể được sử dụng trong trường hợp này không? Ai đó có thể chỉ đạo tôi đi đúng hướng không?

+0

V.M tùy chỉnh Ý tưởng thú vị. Bằng cách phơi bày các hàm, bạn có nghĩa là gọi một D.L.L./Đối tượng được chia sẻ/chức năng Thư viện được chia sẻ hoặc từ thư viện "* .h"? – umlcat

Trả lời

5

Câu trả lời chung là bạn phải tự mình triển khai bằng cách lắp ráp. Sau khi liên kết với libc, bạn có địa chỉ của hàm bạn muốn gọi và bạn phải chuyển các tham số tới hàm bằng tay (sử dụng quy ước gọi của bất kỳ nền tảng nào mà máy ảo của bạn đang chạy).

May mắn là có thư viện, libffi, thực hiện chính xác những gì bạn muốn. Nó khá dễ sử dụng, nguồn của nó bao gồm một số tài liệu và ví dụ. Nếu bạn quan tâm để xem cách hoạt động, bạn có thể xem mã của nó (ví dụ: calling a function using the unix calling convention).

Về các kiểu tham số, bạn thường phải để người dùng mô tả chúng và chấp nhận một cách mù quáng và chuyển tiếp chúng vào libffi (hoặc phần cứng nếu bạn làm điều đó không có libffi). Một cách khác là phân tích cú pháp tệp tiêu đề C để gọi hàm, ít bị lỗi hơn - nhưng trong mọi trường hợp, thực sự không có cách nào an toàn vì mã nhị phân cho hàm không mô tả giao diện của nó (với printf và danh sách tham số biến nhiều hơn thế).

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