Go 바이너리에서 동적으로 컴파일 및 링크
이 시나리오에는 다음의 컴파일과 링크가 필요한 기존 Go 바이너리가 있습니다. 런타임 시 외부 Go 파일. 목표는 이후 사용을 위해 컴파일된 코드를 바이너리에 동적으로 로드하는 것입니다.
이전 버전의 Go에서는 이 프로세스가 지원되지 않았습니다. 하지만 Go 1.5가 등장하면서 공유 라이브러리의 생성과 연동이 가능해졌습니다.
Andrew Gerrand의 "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 중국어 웹사이트의 기타 관련 기사를 참조하세요!