advanced-go-programming-book icon indicating copy to clipboard operation
advanced-go-programming-book copied to clipboard

ch3.1: Broken under Go 1.12 (relocation target runtime.printstring not defined for ABI0 (but is defined for ABIInternal))

Open chai2010 opened this issue 5 years ago • 7 comments

https://github.com/golang/proposal/blob/master/design/27539-internal-abi.md

chai2010 avatar Mar 19 '19 12:03 chai2010

main.go

package main

var helloworld = "你好, 世界"

func main()

main.s:

TEXT ·main(SB), $16-0
	MOVQ ·helloworld+0(SB), AX; MOVQ AX, 0(SP)
	MOVQ ·helloworld+8(SB), BX; MOVQ BX, 8(SP)
	CALL runtime·printstring(SB)
	CALL runtime·printnl(SB)
	RET
$ go build
main.main: relocation target runtime.printstring not defined for ABI0 (but is defined for ABIInternal)
main.main: relocation target runtime.printnl not defined for ABI0 (but is defined for ABIInternal)

chai2010 avatar Mar 19 '19 12:03 chai2010

https://github.com/go-qml/qml/issues/190

chai2010 avatar Mar 19 '19 13:03 chai2010

这是第一节内容,目的是展示怎么自定义main函数。可以绕过变化到部分。

Go部分可以改成如下格式:

package main

import "fmt"

var helloworld = "你好, 世界"

func println(s string) {
	fmt.Println(s)
}

func main()

然后汇编部分:

TEXT ·main(SB), $16-0
    MOVQ ·helloworld+0(SB), AX; MOVQ AX, 0(SP)
    MOVQ ·helloworld+8(SB), BX; MOVQ BX, 8(SP)
    CALL ·println(SB)
    RET

在汇编实现中,main函数调用自定义到println函数实现打印。

chai2010 avatar Jul 03 '19 02:07 chai2010

Go 部分

main.go

package main

var helloWorld = "Hello, 世界"

func output(s string) {
	println(s)
}

func main()

汇编部分

main_amd64.s

TEXT ·main(SB), $16-0
    MOVQ ·helloWorld+0(SB), AX
    MOVQ AX, 0(SP)
    MOVQ ·helloWorld+8(SB), BX
    MOVQ BX, 8(SP)
    CALL ·output(SB)
    RET

也许更简单一点 ~

wangzhione avatar Aug 03 '19 05:08 wangzhione

go1.14提示 missing function body

代码如下:main3.go package main

import ( "fmt" )

var helloWorld = "你好, 世界" func println(s string) { fmt.Println(s) } func main()

汇编文件 main3_amd64.s //func main() TEXT ·main(SB), $16-0 MOVQ ·helloWorld+0(SB),AX MOVQ AX, 0(SP) MOVQ ·helloWorld+8(SB),BX MOVQ BX, 8(SP) CALL ·println(SB) RET

xujunhai avatar Jul 28 '20 08:07 xujunhai

go1.14提示 missing function body

代码如下:main3.go package main

import ( "fmt" )

var helloWorld = "你好, 世界" func println(s string) { fmt.Println(s) } func main()

汇编文件 main3_amd64.s //func main() TEXT ·main(SB), $16-0 MOVQ ·helloWorld+0(SB),AX MOVQ AX, 0(SP) MOVQ ·helloWorld+8(SB),BX MOVQ BX, 8(SP) CALL ·println(SB) RET

go run 执行会报错, build 后再运行就可以了。

hopehook avatar Dec 28 '21 05:12 hopehook

参考 compatibility section 这样写:

main.go

package main

import _ "unsafe"

//go:linkname printnl runtime.printnl
func printnl()

//go:linkname printstring runtime.printstring
func printstring(s string)

var helloWorld = "你好,世界"

func main()

main_amd64.s

TEXT ·main(SB), $16-0
	MOVQ ·helloWorld+0(SB), AX
	MOVQ AX, 0(SP)
	MOVQ ·helloWorld+8(SB), BX
	MOVQ BX, 8(SP)
	CALL runtime·printstring(SB)
	CALL runtime·printnl(SB)
	RET

feiquan123 avatar Jun 01 '22 12:06 feiquan123