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