Diagram
package main

var global_init_xyz int64 = 3
var global_noinit_xyz int64
var global_init_strxyz string = "hello"
var global_noinit_strxyz string

const global_xyz int64 = 314  // 常量
func main() {
    var local_xyz int64 = 2
    println(&local_xyz)
    println(&global_init_xyz)
    println(&global_noinit_xyz)
    println(&global_init_strxyz)
    println(&global_noinit_strxyz)
    println(global_xyz)
}
go build -o main -gcflags "-N -l" main.go
# size 可执行文件
# 查看程序内存的代码段 数据段等
# 最好使用c程序来 看各个变量在哪个段
size main
# dec = text+data+bss
# hex 是dec的16进制数
    text       data     bss     dec     hex filename
    774543    13424  202000  989967   f1b0f main
objdump -t main|grep xyz
    00000000004c0170 g     O .noptrdata 0000000000000008 main.global_init_xyz
    00000000004f10a0 g     O .noptrbss  0000000000000008 main.global_noinit_xyz
    00000000004c12e0 g     O .data  0000000000000010 main.global_init_strxyz
    00000000004c35b0 g     O .bss   0000000000000010 main.global_noinit_strxyz
objdump -t main|grep string
    0000000000466220 l     O .rodata    0000000000000000 go:string.*
go tool compile -S -N -l main.go 查看
go:string."hello" SRODATA dupok size=5
0x0000 68 65 6c 6c 6f                                   hello

main.global_init_xyz SNOPTRDATA size=8
main.global_noinit_xyz SNOPTRBSS size=8
main.global_init_strxyz SDATA size=16
main.global_noinit_strxyz SBSS size=16
Tip

字符串 字面量 hello这种是在只读的内存区的.
定义的常量 global_xyz ,在汇编中可能是以 MOVL $314, AX 这种形式来操作的,并不存在只读区,具体情况具体分析
可以关注到go里有 noptrdata noptrbss这种 无指针的 这种区

Back to top