advanced-go-programming-book
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))
https://github.com/golang/proposal/blob/master/design/27539-internal-abi.md
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)
https://github.com/go-qml/qml/issues/190
这是第一节内容,目的是展示怎么自定义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函数实现打印。
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
也许更简单一点 ~
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
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 后再运行就可以了。
参考 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