Tôi cần gọi hàm bằng C chỉ bằng cách biết địa chỉ và không có thông tin trên nguyên mẫu đó (Tôi không thể truyền nó tới con trỏ hàm C).Gọi địa chỉ C làm chức năng không có mẫu thử
Thông tin tôi có về chức năng này là địa chỉ.
Tôi cũng biết các thông số tôi muốn chuyển cho nó (nhờ có con trỏ trống) và kích thước của mảng đối số (truy cập máng con trỏ trống).
Tôi cũng muốn tôn trọng quy ước gọi điện C. Đối với phiên bản x86, tôi khá nhiều biết làm thế nào để làm điều đó (phân bổ không gian trên ngăn xếp, sao chép các tham số để không gian đó và cuối cùng gọi hàm).
Vấn đề là với quy ước x64 (Linux hiện tại) trong đó thông số là được chuyển qua thanh ghi. Tôi không có ý tưởng về kích thước của mỗi tham số để điền đăng ký thích hợp, tôi chỉ biết kích thước của mảng tham số.
Ngoài ra, tôi không muốn phụ thuộc vào gcc vì vậy tôi không thể sử dụng __builtin_apply có vẻ như không chuẩn và cũng khá tối.
Tôi muốn viết đoạn mã riêng của mình để hỗ trợ nhiều trình biên dịch và cũng để tìm hiểu nội dung thú vị.
Vì vậy, về cơ bản, chức năng tôi muốn viết như nguyên mẫu giống như __builtin_apply đó là:
void *call_ptr(void (*fun)(), void *params, size_t size);
Tôi cũng muốn đoạn code để viết nó trong C (nhờ asm inline) hoặc tinh khiết x64 asm .
Vì vậy, có cách nào để thực hiện việc này đúng cách và đối với quy ước gọi là không? Hoặc điều này là không thể với quy ước x64 mà không biết chính xác nguyên mẫu của hàm được gọi là ?
Hãy xem [libffi] (http://sourceware.org/libffi/). – tangrs
Điều này có thể là một thay thế tuyệt vời, nhưng vấn đề với libffi là nó cần phải biết loại của mỗi tham số và kiểu trả về của hàm. Tôi muốn tránh thu thập những thông tin này để tránh mất thời gian nếu có thể. Vì vậy, có thể với kiến trúc x64? – Zerkan
@ Zerkan không có, bạn cần các loại tham số, không có phép thuật nào có thể đặt các thông số trong sổ đăng ký thích hợp hoặc không gian ngăn xếp khi gọi một hàm mà không biết đối số – nos