>백엔드 개발 >Golang >Go 애플리케이션이 .so 파일 내부의 기능과 어떻게 상호 작용할 수 있나요?

Go 애플리케이션이 .so 파일 내부의 기능과 어떻게 상호 작용할 수 있나요?

Patricia Arquette
Patricia Arquette원래의
2024-11-02 05:25:30907검색

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.