<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          LibFFI外部函數(shù)接口

          聯(lián)合創(chuàng)作 · 2023-09-28 18:27

          “FFI” 的全名是 Foreign Function Interface,通常指的是允許以一種語(yǔ)言編寫的代碼調(diào)用另一種語(yǔ)言的代碼。而 “Libffi” 庫(kù)只提供了最底層的、與架構(gòu)相關(guān)的、完整的”FFI”,因此在它之上必須有一層來(lái)負(fù)責(zé)管理兩種語(yǔ)言之間參數(shù)的格式轉(zhuǎn)換。

          高級(jí)語(yǔ)言編譯器產(chǎn)生代碼時(shí)都會(huì)依據(jù)一系列的規(guī)則,這些規(guī)則十分必要,特別是對(duì)獨(dú)立編譯來(lái)說(shuō)。其中之一是“調(diào)用約定” (Calling Convention),它包含了編譯器關(guān)于函數(shù)入口處的函數(shù)參數(shù)、函數(shù)返回值的一系列假設(shè)。它有時(shí)也被稱作“ABI”(Application Binary Interface)。調(diào)用約定(Calling Conventions)定義了程序中調(diào)用函數(shù)的方式,它決定了在函數(shù)調(diào)用的時(shí)候數(shù)據(jù)(比如說(shuō)參數(shù))在堆棧中的組織方式。

          通常來(lái)說(shuō)函數(shù)調(diào)用要用到的兩條基本的指令:”CALL”指令和”RET”指令。”CALL”指令將當(dāng)前的指令指針(這個(gè)指針指向緊接在CALL指令后面的那條指令)壓入堆棧,然后執(zhí)行一條無(wú)條件轉(zhuǎn)移指令轉(zhuǎn)移到新的代碼地址。”RET”是與”CALL”指令配合使用的指令,在絕大多數(shù)函數(shù)中它是最后一條指令。”RET”指令彈出返回地址(就是早些時(shí)候”CALL”指令壓入堆棧的地址)并將其加載到”EIP”寄存器中,然后從這個(gè)地址開(kāi)始繼續(xù)執(zhí)行。

          圖1-1 說(shuō)明調(diào)用約定”stdcall”的調(diào)用過(guò)程,調(diào)用時(shí),最末一個(gè)參數(shù)最先壓入堆棧,而由被調(diào)用函數(shù)使用RET指令清棧。RET指令帶有一個(gè)操作數(shù),該操作數(shù)指明在EIP跳回主要函數(shù)之前需要釋放的堆棧空間的字節(jié)數(shù)。這就是說(shuō),stdcall調(diào)用約定中RET指令帶的操作數(shù)往往就意味著函數(shù)一共傳入幾個(gè)參數(shù)。

          圖1-1 stdcall調(diào)用

          獨(dú)立編譯時(shí),調(diào)用一個(gè)函數(shù)除了要知道函數(shù)的簽名外,還要知道其調(diào)用約定。比如 Delphi 中調(diào)用”Stdcall”的”VC++”的函數(shù),需對(duì)調(diào)用約定加以聲明。

          Procedure ShowMess (h :HWND; mess :PChar ); Stdcall; external LibName;

          “LibFFI”針對(duì)這些不同的調(diào)用約定,提供一個(gè)高層次的可移植的API,只需調(diào)用這些API就可以在運(yùn)行時(shí)進(jìn)行動(dòng)態(tài)的函數(shù)調(diào)用。(這種方式和函數(shù)指針不同,函數(shù)指針比如在編譯時(shí)就決定了函數(shù)的類型,而”libffi”可以在運(yùn)行時(shí)是才決定被調(diào)用函數(shù)的類型)。有了 libffi ,我們就有可能寫出一個(gè)通用而且簡(jiǎn)潔的調(diào)用 C 函數(shù)的方法。

          目前有許多項(xiàng)目都使用了 libff ,包括 ruby,cpython, openjdk,dalvik vm 等等。例如在 Ruby 中,利用 rubyffi (包裝了 libffi )可以如此動(dòng)態(tài)地調(diào)用一個(gè) dll

          介紹內(nèi)容來(lái)自:http://blogs.ejb.cc/archives/1502/libffi-example-of-the-use

          瀏覽 21
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          編輯 分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          編輯 分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  1234无码在线观看 | 91视频大香蕉 | 慢慢操一区二区 | 一本色道久久88亚洲综合加勒比 | 免费无码又爽又高潮的网站 |