Go バイナリからの動的コンパイルとリンク
このシナリオでは、Go バイナリのコンパイルとリンクを必要とする既存の Go バイナリがあります。実行時の外部 Go ファイル。目標は、コンパイルされたコードを後で使用できるようにバイナリに動的にロードすることです。
以前のバージョンの Go では、このプロセスはサポートされていませんでした。しかし、Go 1.5 の導入により、共有ライブラリの作成とリンクが可能になりました。
Andrew Gerand 氏の講演「The State of Go」で述べられているように、
Shared Go 1.5 のライブラリ
$ 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 サイトの他の関連記事を参照してください。