Maison  >  Article  >  développement back-end  >  Comment les applications Go peuvent-elles interagir avec les fonctions contenues dans un fichier .so ?

Comment les applications Go peuvent-elles interagir avec les fonctions contenues dans un fichier .so ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-02 05:25:30800parcourir

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

Invocation de fonctions dans un fichier SO à partir de Go

Question : Les applications Go peuvent-elles interagir avec les fonctions d'un fichier d'objet statique (.so) ?

Réponse : Oui, il est possible de charger et d'invoquer des fonctions à partir d'une bibliothèque à l'aide de Go. Cependant, le package syscall intégré ne fournit pas la fonction LoadLibrary, malgré les affirmations contraires en ligne.

Pour ce faire, vous pouvez exploiter cgo, un outil qui relie le code C et Go. Voici un exemple utilisant dlopen et les fonctions associées de la bibliothèque POSIX C :

<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>

Dans cet exemple :

  • LDFLAGS spécifie que la bibliothèque dlopen doit être liée au programme Go.
  • dlopen charge l'objet partagé en mémoire.
  • dlsym récupère l'adresse de la fonction bar dans la bibliothèque chargée.
  • L'instruction fmt.Printf génère l'adresse mémoire où bar réside.

En suivant cette approche, vous pouvez appeler de manière transparente des fonctions dans des bibliothèques externes à partir de votre code Go.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn