ホームページ > バックエンド開発 > Golang > 実行時に外部の Go コードを動的にコンパイルして Go バイナリにリンクするにはどうすればよいですか?

実行時に外部の Go コードを動的にコンパイルして Go バイナリにリンクするにはどうすればよいですか?

DDD
リリース: 2025-01-02 19:47:39
オリジナル
361 人が閲覧しました

How Can I Dynamically Compile and Link External Go Code into a Go Binary at Runtime?

Go バイナリからの動的コンパイルとリンク

このシナリオでは、Go バイナリのコンパイルとリンクを必要とする既存の Go バイナリがあります。実行時の外部 Go ファイル。目標は、コンパイルされたコードを後で使用できるようにバイナリに動的にロードすることです。

以前のバージョンの Go では、このプロセスはサポートされていませんでした。しかし、Go 1.5 の導入により、共有ライブラリの作成とリンクが可能になりました。

Andrew Gerand 氏の講演「The State of Go」で述べられているように、

Shared Go 1.5 のライブラリ

  • Go 1.5 では、Go 共有の作成が可能になります他の Go プログラムでインポートして使用できるライブラリ。
  • 標準ライブラリを共有ライブラリとしてビルドするには:
$ go install -buildmode=shared std
ログイン後にコピー
  • 共有ライブラリ:
$ go build -linkshared hello.go
$ ls -l hello
-rwxr-xr-x 1 adg adg 13926 May 26 02:13 hello
ログイン後にコピー

Go 1.5 では、外部 Go ファイルからコンパイルされたコードを動的にロードできます。次のコードを含めてバイナリに追加します。

package main

import (
    "fmt"
    "syscall"
)

func main() {
    // Load the external shared library
    lib, err := syscall.LoadLibrary("myexternallibrary.so")
    if err != nil {
        panic(fmt.Sprintf("Error loading library: %v", err))
    }
    defer syscall.FreeLibrary(lib)
    
    // Get the function pointer from the library
    sym, err := syscall.GetProcAddress(lib, "runFoo")
    if err != nil {
        panic(fmt.Sprintf("Error getting function pointer: %v", err))
    }

    // Execute the function
    _, _, err = syscall.Syscall(sym, 0, 0, 0, 0)
    if err != nil {
        panic(fmt.Sprintf("Error calling function: %v", err))
    }
}
ログイン後にコピー

提供されたコードでは、「myexternallibrary.so」は「runFoo」関数を含む共有ライブラリの名前です。このアプローチにより、実行時に外部 Go コードを動的にコンパイルして既存のバイナリにリンクでき、最初の問題を解決できます。

以上が実行時に外部の Go コードを動的にコンパイルして Go バイナリにリンクするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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