簡體   English   中英

如何將C函數公開給自定義虛擬機?

[英]How can I expose C functions to a custom virtual machine?

我正在研究一個我希望能夠與C接口的虛擬機。走另一條路並將虛擬機功能暴露給C代碼相當容易,我無法理解的是將C函數暴露給一台虛擬機。

我希望能夠像虛擬機一樣動態注冊C函數:

vm_register(printf);

然后在我的虛擬機中,將參數推送到堆棧,並且:

call printf

問題是,在不知道函數需要多少個參數以及什么類型的情況下,我不確定可以使用函數指針。

是否存在可在此情況下使用的通用函數指針類型? 有人能引導我朝着正確的方向前進嗎?

一般的答案是你必須自己使用匯編來實現它。 與libc鏈接后,您將擁有要調用的函數的地址,並且必須手動將參數傳遞給函數(使用運行虛擬機的任何平台的調用約定)。

幸運的是,有一個庫, libffi ,它可以完全滿足您的需求。 它也很容易使用,它的來源包括一些文檔和示例。 如果您有興趣了解它是如何工作的,您可以查看其代碼(例如, 使用unix調用約定調用函數 )。

關於參數類型,您通常必須讓用戶為您描述它們並盲目地接受它並將它們進一步傳遞給libffi(如果您在沒有libffi的情況下將其傳遞給硬件)。 另一種方法是解析要調用的函數的C頭文件,這不容易出錯 - 但無論如何,實際上沒有安全的方法,因為函數的二進制代碼沒有描述它的接口(使用printf及其變量參數列表更是如此)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM