Maison > développement back-end > Golang > Exemples pour expliquer comment utiliser go:linkname

Exemples pour expliquer comment utiliser go:linkname

藏色散人
Libérer: 2021-12-17 14:32:56
avant
2230 Les gens l'ont consulté

Cet article est introduit par la colonne tutoriel golang pour présenter comment utiliser go:linkname. J'espère qu'il sera utile aux amis qui en ont besoin !

Utilisation de go:linkname

Dans le code source du langage go, vous trouverez beaucoup de codes qui n'ont que des signatures de fonction, mais pas le corps de la fonction, comme par exemple :

// src/os/proc.go 68行
func runtime_beforeExit() // implemented in runtime
Copier après la connexion

Ici on ne voit que la signature de la fonction, mais pas le corps de la fonction. Je n'ai pas pu voir le corps de la fonction, j'ai donc cherché globalement et j'ai découvert que son corps de fonction est défini dans src/runtime/proc.go

// os_beforeExit is called from os.Exit(0).
//go:linkname os_beforeExit os.runtime_beforeExit
func os_beforeExit() {
    if raceenabled {
        racefini()
    }
}
Copier après la connexion

Il connecte la signature de la fonction et la fonction. corps via go:linkname. Alors pouvons-nous implémenter cela dans le code ? Puisque cela peut être utilisé dans les fonctions de la bibliothèque, peut-il également être utilisé dans notre propre structure de code ? Ce qui suit est une manière expérimentale de mettre en œuvre une telle utilisation étape par étape
Créer le répertoire du projet

$mkdir demo && cd demo
Copier après la connexion

go mod initialiser le répertoire du projet

$go mod init demo
Copier après la connexion

Créer le paquet de signature de fonction et le paquet de corps de fonction

$mkdir hello
$mkdir link
Copier après la connexion

Écrire le code de test

$cd hello
// 函数签名
$vim hello.go
package hello

import (
    _ "demo/link"
)

func Hello()

// 函数体
$vim link.go
package link

import _ "unsafe"

//go:linkname helloWorld demo/hello.Hello
func helloWorld() {
    println("hello world!")
}
Copier après la connexion

Exécutez le code

$cd demo
vim demo.go
package main

import (
    "demo/hello"
)

func main() {
    hello.Hello()
}
Copier après la connexion

Compilez et exécutez

go run demo.go
# demo/hello
hello/hello.go:7:6: missing function body
Copier après la connexion

Ajoutez la marque du fichier d'assemblage aa.s sous le dossier hello, et vous pourrez compiler et exécuter

$cd hello && touch aa.s
$go run demo.go
hello world!
Copier après la connexion

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!

Étiquettes associées:
source:segmentfault.com
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal