Go から静的オブジェクト ファイル内の関数を呼び出す方法

Patricia Arquette
リリース: 2024-11-03 12:04:29
オリジナル
927 人が閲覧しました

How to Call Functions in Static Object Files from Go?

Go から静的オブジェクト ファイル内の関数を呼び出す

Go 内の共有ライブラリ (.so) ファイルから関数を呼び出そうとします。この目的で syscall.LoadLibrary を使用するという提案があったかもしれませんが、その試みは「未定義: syscall.LoadLibrary」というエラーで失敗しました。

しかし、共有ライブラリをロードしてアクセスすることは確かに可能です。 Go の機能。 POSIX プラットフォームでこれを実現するには、cgo を利用してシステムのネイティブ API と対話できます。

cgo を使用した簡単なデモを次に示します。

<code class="go">// +build linux darwin
// #cgo LDFLAGS: -ldl
// #include <dlfcn.h>

package main

import (
    "C"
    "fmt"
)

func foo() {
    // Load the shared library
    handle := C.dlopen(C.CString("libfoo.so"), C.RTLD_LAZY)

    // Retrieve the function pointer from the library
    bar := C.dlsym(handle, C.CString("bar"))

    // Print the function pointer address
    fmt.Printf("bar is at %p\n", bar)
}

func main() { foo() }</code>
ログイン後にコピー

この中で例:

  • ビルド ディレクティブは、コンパイルを Linux および Darwin プラットフォームに制限します。
  • #cgo LDFLAGS: -ldl は、実行可能ファイルをダイナミック リンカー ライブラリ (libdl) にリンクします。
  • #include dlopen 関数と dlsym 関数に必要な C ヘッダーをインポートします。
  • foo 関数は、共有ライブラリをロードし、「bar」関数の関数ポインタを取得し、そのアドレスを出力します。

正確な構文と関数名は、基礎となるシステムとコンパイラによって異なる場合があることに注意してください。 cgo を利用し、ネイティブ システム API と対話することで、Go と共有ライブラリ間のギャップを埋め、アプリケーションの機能を拡張できます。

以上がGo から静的オブジェクト ファイル内の関数を呼び出す方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート