go:linkname 사용 방법을 설명하는 예

藏色散人
풀어 주다: 2021-12-17 14:32:56
앞으로
2199명이 탐색했습니다.

이 글은 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을 통해 이루어집니다. 그럼 이것을 코드로 구현할 수 있을까요? 라이브러리 함수에서도 사용할 수 있는데, 우리가 만든 코드 구조에서도 사용할 수 있나요? 다음은 이러한 사용법을 단계별로 구현하는 실험적인 방법입니다
프로젝트 디렉토리 만들기

$mkdir demo && cd demo
로그인 후 복사

mod 초기화 프로젝트 디렉토리

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

관련 라벨:
원천:segmentfault.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!