go:linkname の使用方法を説明する例

藏色散人
リリース: 2021-12-17 14:32:56
転載
2198 人が閲覧しました

この記事は、 golang チュートリアル コラムで go:linkname の使い方を紹介するもので、困っている友人の役に立てば幸いです。

go:linkname の使用法

Go 言語のソース コードには、関数シグネチャのみを持つコードがたくさんありますが、関数本体が表示されません。例:

// src/os/proc.go 68行
func runtime_beforeExit() // implemented in runtime
ログイン後にコピー

ここでは、関数シグネチャのみが表示されますが、関数本体は表示されません。グローバルに検索した結果、その関数本体は 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()
    }
}
ログイン後にコピー

go:linkname を通じて関数シグネチャと関数本体を接続します。では、これをコードで実装できるでしょうか?これはライブラリ関数で使用できるので、独自のコード構造でも使用できますか?以下は、そのような使用法を段階的に実装するための実験的な方法です。
Create project directory

$mkdir demo && cd demo
ログイン後にコピー

go mod initialize project directory

$go mod init demo
ログイン後にコピー

関数シグネチャ pkg と関数本体 pkg の作成

$mkdir hello
$mkdir link
ログイン後にコピー

テスト コードの作成

$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!")
}
ログイン後にコピー

コードの実行

$cd demo
vim demo.go
package main

import (
    "demo/hello"
)

func main() {
    hello.Hello()
}
ログイン後にコピー

コンパイルと実行

go run demo.go
# demo/hello
hello/hello.go:7:6: missing function body
ログイン後にコピー

hello フォルダに aa.s のアセンブリ ファイル マークを追加すると、コンパイルと実行が可能です

$cd hello && touch aa.s
$go run demo.go
hello world!
ログイン後にコピー

以上がgo:linkname の使用方法を説明する例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:segmentfault.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!