首頁  >  文章  >  後端開發  >  Go 應用程式如何與 .so 檔案內的函數互動?

Go 應用程式如何與 .so 檔案內的函數互動?

Patricia Arquette
Patricia Arquette原創
2024-11-02 05:25:30800瀏覽

How Can Go Applications Interact with Functions Inside a .so File?

從Go 呼叫SO 檔案中的函數

問題:Go 應用程式可以與靜態物件(.so) 檔案中的函數互動嗎?

答案: 是的,使用 Go 從函式庫中載入和呼叫函數是可行的。然而,內建的 syscall 套件不提供 LoadLibrary 函數,儘管網路上有相反的說法。

為了實現這一點,您可以利用 cgo,一個橋接 C 和 Go 程式碼的工具。以下是使用 POSIX C 函式庫中的 dlopen 和相關函數的範例:

<code class="go">// #cgo LDFLAGS: -ldl
// #include <dlfcn.h>
import "C"

import fmt

func foo() {
    handle := C.dlopen(C.CString("libfoo.so"), C.RTLD_LAZY)
    bar := C.dlsym(handle, C.CString("bar"))
    fmt.Printf("bar is at %p\n", bar)
}</code>

在此範例中:

  • LDFLAGS 指定 dlopen 函式庫應連結到 Go 程式。
  • dlopen 將共享物件載入到記憶體中。
  • dlsym 擷取載入的庫中 bar 函數的位址。
  • fmt.Printf 語句輸出 bar 所在的記憶體位址

透過此方法,您可以從 Go 程式碼中無縫地呼叫外部函式庫中的函數。

以上是Go 應用程式如何與 .so 檔案內的函數互動?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn