ホームページ >バックエンド開発 >Golang >Go アプリケーションは .so ファイル内の関数とどのようにやり取りできるのでしょうか?

Go アプリケーションは .so ファイル内の関数とどのようにやり取りできるのでしょうか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-02 05:25:30900ブラウズ

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

Go から SO ファイル内の関数を呼び出す

質問: Go アプリケーションは静的オブジェクト (.so) ファイル内の関数と対話できますか?

答え: はい、Go を使用してライブラリから関数をロードして呼び出すことは可能です。ただし、オンラインでは反対の主張があるにもかかわらず、組み込みの syscall パッケージは LoadLibrary 関数を提供しません。

これを実現するには、C と Go コードの橋渡しツールである cgo を活用できます。 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。