创建main.go
package main
import "fmt"
var xxx = 0xEE // 通过值来推断类型
var yyy int = 0xFF // 定义类型,并赋值
var zzz int // 定义变量
var ddd *int
func main() {
xxx = 0x11
yyy = 0x22
zzz = 0x33
k := 10
ddd = &k
fmt.Println(xxx, yyy, zzz)
}
linux环境编译
// -N 关闭编译器优化
// -l 关闭内联
go build -gcflags "-N -l" main.go
// 或者 go build -gcflags=all="-N -l" main.go
gdb调试
gdb main // 调试程序,进入gdb模式(gdb) b 15 // 第15行打个断点(gdb) r // 运行(gdb) set disassembly-flavor intel // 设置汇编语言为intel(gdb) disass
可以查看到变量分配的地址
- xxx: 0x50d108
- yyy: 0x50d110
- zzz: 0x553dc0
- ddd: 0x524e40
(gdb) disass
Dump of assembler code for function main.main:
0x000000000047e260 <+0>: lea -0x30(%rsp),%r12
0x000000000047e265 <+5>: cmp 0x10(%r14),%r12
0x000000000047e269 <+9>: jbe 0x47e45f <main.main+511>
0x000000000047e26f <+15>: sub $0xb0,%rsp
0x000000000047e276 <+22>: mov %rbp,0xa8(%rsp)
0x000000000047e27e <+30>: lea 0xa8(%rsp),%rbp
0x000000000047e286 <+38>: movq $0x11,0x8ee77(%rip) # 0x50d108 <main.xxx>
0x000000000047e291 <+49>: movq $0x22,0x8ee74(%rip) # 0x50d110 <main.yyy>
0x000000000047e29c <+60>: movq $0x33,0xd5b19(%rip) # 0x553dc0 <main.zzz>
0x000000000047e2a7 <+71>: lea 0x75f2(%rip),%rax # 0x4858a0
0x000000000047e2ae <+78>: callq 0x40bbc0 <runtime.newobject>
0x000000000047e2b3 <+83>: mov %rax,0x48(%rsp)
0x000000000047e2b8 <+88>: movq $0xa,(%rax)
0x000000000047e2bf <+95>: mov 0x48(%rsp),%rcx
0x000000000047e2c4 <+100>: cmpl $0x0,0xd5cd5(%rip) # 0x553fa0 <runtime.writeBarrier>
0x000000000047e2cb <+107>: je 0x47e2cf <main.main+111>
0x000000000047e2cd <+109>: jmp 0x47e2d8 <main.main+120>
0x000000000047e2cf <+111>: mov %rcx,0xa6b6a(%rip) # 0x524e40 <main.ddd>
0x000000000047e2d6 <+118>: jmp 0x47e2e7 <main.main+135>
0x000000000047e2d8 <+120>: lea 0xa6b61(%rip),%rdi # 0x524e40 <main.ddd>
0x000000000047e2df <+127>: nop
0x000000000047e2e0 <+128>: callq 0x45ac40 <runtime.gcWriteBarrierCX>
0x000000000047e2e5 <+133>: jmp 0x47e2e7 <main.main+135>
=> 0x000000000047e2e7 <+135>: lea 0x68(%rsp),%rcx
0x000000000047e2ec <+140>: movups %xmm15,(%rcx)
0x000000000047e2f0 <+144>: lea 0x78(%rsp),%rcx
0x000000000047e2f5 <+149>: movups %xmm15,(%rcx)
--Type <RET> for more, q to quit, c to continue without paging--c
因为disass打印的内容较多,根据提示按c继续就行
接着查看变量所在的section(段)在哪里
通过在gdb模式下, 输入:info symbol 变量地址查看
(gdb) info symbol 0x50d108
main.xxx in section .noptrdata of /home/test/main
(gdb) info symbol 0x50d110
main.yyy in section .noptrdata of /home/test/main
(gdb) info symbol 0x553dc0
main.zzz in section .noptrbss of /home/test/main
(gdb) info symbol 0x524e40
main.ddd in section .bss of /home/test/main
我们可以看到xxx与yyy位于.noptrdata段(Section)内。zzz位于.noptrbss段(Section)内。ddd位于.bss段(Section)内。
我们可以通过 info files查看section的分配情况
(gdb) info files
Symbols from "/home/test/main".
Native process:
Using the running image of child LWP 33871.
While running this, GDB does not access memory from...
Local exec file:
`/home/test/main', file type elf64-x86-64.
Entry point: 0x45c1a0
0x0000000000401000 - 0x000000000047e46a is .text
0x000000000047f000 - 0x00000000004b3e8d is .rodata
0x00000000004b4020 - 0x00000000004b44f8 is .typelink
0x00000000004b4500 - 0x00000000004b4558 is .itablink
0x00000000004b4558 - 0x00000000004b4558 is .gosymtab
0x00000000004b4560 - 0x000000000050cc70 is .gopclntab
0x000000000050d000 - 0x000000000050d020 is .go.buildinfo
0x000000000050d020 - 0x000000000051d5e0 is .noptrdata // 无指针的
0x000000000051d5e0 - 0x0000000000524df0 is .data // 有指针的
0x0000000000524e00 - 0x0000000000553d28 is .bss // 有指针的
0x0000000000553d40 - 0x00000000005590a0 is .noptrbss // 无指针的
0x0000000000400f9c - 0x0000000000401000 is .note.go.buildid
0x00007ffff7ffe120 - 0x00007ffff7ffe164 is .hash in system-supplied DSO at 0x7ffff7ffe000
0x00007ffff7ffe168 - 0x00007ffff7ffe1b8 is .gnu.hash in system-supplied DSO at 0x7ffff7ffe000
0x00007ffff7ffe1b8 - 0x00007ffff7ffe2d8 is .dynsym in system-supplied DSO at 0x7ffff7ffe000
0x00007ffff7ffe2d8 - 0x00007ffff7ffe34a is .dynstr in system-supplied DSO at 0x7ffff7ffe000
0x00007ffff7ffe34a - 0x00007ffff7ffe362 is .gnu.version in system-supplied DSO at 0x7ffff7ffe000
0x00007ffff7ffe368 - 0x00007ffff7ffe3a0 is .gnu.version_d in system-supplied DSO at 0x7ffff7ffe000
0x00007ffff7ffe3a0 - 0x00007ffff7ffe4c0 is .dynamic in system-supplied DSO at 0x7ffff7ffe000
0x00007ffff7ffe4c0 - 0x00007ffff7ffe514 is .note in system-supplied DSO at 0x7ffff7ffe000
0x00007ffff7ffe514 - 0x00007ffff7ffe558 is .eh_frame_hdr in system-supplied DSO at 0x7ffff7ffe000
--Type <RET> for more, q to quit, c to continue without paging--
总结
初始化的全局变量分配在.data / .noptrdata段(Section)内
未初始化的全局变量分配在.bss / .noptrbss段(Section)内
局部变量在程序运行时分配内存地址。
go tool objdump -s "main\.main" main
root@lan:/home/test# go tool objdump -s "main\.main" main
TEXT main.main(SB) /home/test/main.go
main.go:9 0x47e260 4c8d6424d0 LEAQ -0x30(SP), R12
main.go:9 0x47e265 4d3b6610 CMPQ 0x10(R14), R12
main.go:9 0x47e269 0f86f0010000 JBE 0x47e45f
main.go:9 0x47e26f 4881ecb0000000 SUBQ $0xb0, SP
main.go:9 0x47e276 4889ac24a8000000 MOVQ BP, 0xa8(SP)
main.go:9 0x47e27e 488dac24a8000000 LEAQ 0xa8(SP), BP
main.go:10 0x47e286 48c70577ee080011000000 MOVQ $0x11, main.xxx(SB)
main.go:11 0x47e291 48c70574ee080022000000 MOVQ $0x22, main.yyy(SB)
main.go:12 0x47e29c 48c705195b0d0033000000 MOVQ $0x33, main.zzz(SB)
main.go:13 0x47e2a7 488d05f2750000 LEAQ 0x75f2(IP), AX
main.go:13 0x47e2ae e80dd9f8ff CALL runtime.newobject(SB)
main.go:13 0x47e2b3 4889442448 MOVQ AX, 0x48(SP)
main.go:13 0x47e2b8 48c7000a000000 MOVQ $0xa, 0(AX)
main.go:14 0x47e2bf 488b4c2448 MOVQ 0x48(SP), CX
main.go:14 0x47e2c4 833dd55c0d0000 CMPL $0x0, runtime.writeBarrier(SB)
main.go:14 0x47e2cb 7402 JE 0x47e2cf
main.go:14 0x47e2cd eb09 JMP 0x47e2d8
main.go:14 0x47e2cf 48890d6a6b0a00 MOVQ CX, main.ddd(SB)
main.go:14 0x47e2d6 eb0f JMP 0x47e2e7
main.go:14 0x47e2d8 488d3d616b0a00 LEAQ main.ddd(SB), DI
main.go:14 0x47e2df 90 NOPL
main.go:14 0x47e2e0 e85bc9fdff CALL runtime.gcWriteBarrierCX(SB)
main.go:14 0x47e2e5 eb00 JMP 0x47e2e7
main.go:15 0x47e2e7 488d4c2468 LEAQ 0x68(SP), CX
main.go:15 0x47e2ec 440f1139 MOVUPS X15, 0(CX)
main.go:15 0x47e2f0 488d4c2478 LEAQ 0x78(SP), CX
main.go:15 0x47e2f5 440f1139 MOVUPS X15, 0(CX)
main.go:15 0x47e2f9 488d8c2488000000 LEAQ 0x88(SP), CX
main.go:15 0x47e301 440f1139 MOVUPS X15, 0(CX)
main.go:15 0x47e305 488d8c2498000000 LEAQ 0x98(SP), CX
main.go:15 0x47e30d 440f1139 MOVUPS X15, 0(CX)
main.go:15 0x47e311 488d4c2468 LEAQ 0x68(SP), CX
main.go:15 0x47e316 48894c2440 MOVQ CX, 0x40(SP)
main.go:15 0x47e31b 488b05e6ed0800 MOVQ main.xxx(SB), AX
main.go:15 0x47e322 e879b2f8ff CALL runtime.convT64(SB)
main.go:15 0x47e327 4889442438 MOVQ AX, 0x38(SP)
main.go:15 0x47e32c 488b4c2440 MOVQ 0x40(SP), CX
main.go:15 0x47e331 8401 TESTB AL, 0(CX)
main.go:15 0x47e333 488d1566750000 LEAQ 0x7566(IP), DX
main.go:15 0x47e33a 488911 MOVQ DX, 0(CX)
main.go:15 0x47e33d 488d7908 LEAQ 0x8(CX), DI
main.go:15 0x47e341 833d585c0d0000 CMPL $0x0, runtime.writeBarrier(SB)
main.go:15 0x47e348 7402 JE 0x47e34c
main.go:15 0x47e34a eb06 JMP 0x47e352
main.go:15 0x47e34c 48894108 MOVQ AX, 0x8(CX)
main.go:15 0x47e350 eb07 JMP 0x47e359
main.go:15 0x47e352 e8e9c7fdff CALL runtime.gcWriteBarrier(SB)
main.go:15 0x47e357 eb00 JMP 0x47e359
main.go:15 0x47e359 488b05b0ed0800 MOVQ main.yyy(SB), AX
main.go:15 0x47e360 e83bb2f8ff CALL runtime.convT64(SB)
main.go:15 0x47e365 4889442430 MOVQ AX, 0x30(SP)
main.go:15 0x47e36a 488b4c2440 MOVQ 0x40(SP), CX
main.go:15 0x47e36f 8401 TESTB AL, 0(CX)
main.go:15 0x47e371 488d1528750000 LEAQ 0x7528(IP), DX
main.go:15 0x47e378 48895110 MOVQ DX, 0x10(CX)
main.go:15 0x47e37c 488d7918 LEAQ 0x18(CX), DI
main.go:15 0x47e380 833d195c0d0000 CMPL $0x0, runtime.writeBarrier(SB)
main.go:15 0x47e387 7402 JE 0x47e38b
main.go:15 0x47e389 eb06 JMP 0x47e391
main.go:15 0x47e38b 48894118 MOVQ AX, 0x18(CX)
main.go:15 0x47e38f eb07 JMP 0x47e398
main.go:15 0x47e391 e8aac7fdff CALL runtime.gcWriteBarrier(SB)
main.go:15 0x47e396 eb00 JMP 0x47e398
main.go:15 0x47e398 488b05215a0d00 MOVQ main.zzz(SB), AX
main.go:15 0x47e39f 90 NOPL
main.go:15 0x47e3a0 e8fbb1f8ff CALL runtime.convT64(SB)
main.go:15 0x47e3a5 4889442428 MOVQ AX, 0x28(SP)
main.go:15 0x47e3aa 488b4c2440 MOVQ 0x40(SP), CX
main.go:15 0x47e3af 8401 TESTB AL, 0(CX)
main.go:15 0x47e3b1 488d15e8740000 LEAQ 0x74e8(IP), DX
main.go:15 0x47e3b8 48895120 MOVQ DX, 0x20(CX)
main.go:15 0x47e3bc 488d7928 LEAQ 0x28(CX), DI
main.go:15 0x47e3c0 833dd95b0d0000 CMPL $0x0, runtime.writeBarrier(SB)
main.go:15 0x47e3c7 7402 JE 0x47e3cb
main.go:15 0x47e3c9 eb06 JMP 0x47e3d1
main.go:15 0x47e3cb 48894128 MOVQ AX, 0x28(CX)
main.go:15 0x47e3cf eb07 JMP 0x47e3d8
main.go:15 0x47e3d1 e86ac7fdff CALL runtime.gcWriteBarrier(SB)
main.go:15 0x47e3d6 eb00 JMP 0x47e3d8
main.go:15 0x47e3d8 488b0d616a0a00 MOVQ main.ddd(SB), CX
main.go:15 0x47e3df 8401 TESTB AL, 0(CX)
main.go:15 0x47e3e1 488b01 MOVQ 0(CX), AX
main.go:15 0x47e3e4 4889442418 MOVQ AX, 0x18(SP)
main.go:15 0x47e3e9 e8b2b1f8ff CALL runtime.convT64(SB)
main.go:15 0x47e3ee 4889442420 MOVQ AX, 0x20(SP)
main.go:15 0x47e3f3 488b4c2440 MOVQ 0x40(SP), CX
main.go:15 0x47e3f8 8401 TESTB AL, 0(CX)
main.go:15 0x47e3fa 488d159f740000 LEAQ 0x749f(IP), DX
main.go:15 0x47e401 48895130 MOVQ DX, 0x30(CX)
main.go:15 0x47e405 488d7938 LEAQ 0x38(CX), DI
main.go:15 0x47e409 833d905b0d0000 CMPL $0x0, runtime.writeBarrier(SB)
main.go:15 0x47e410 7402 JE 0x47e414
main.go:15 0x47e412 eb06 JMP 0x47e41a
main.go:15 0x47e414 48894138 MOVQ AX, 0x38(CX)
main.go:15 0x47e418 eb08 JMP 0x47e422
main.go:15 0x47e41a e821c7fdff CALL runtime.gcWriteBarrier(SB)
main.go:15 0x47e41f 90 NOPL
main.go:15 0x47e420 eb00 JMP 0x47e422
main.go:15 0x47e422 488b442440 MOVQ 0x40(SP), AX
main.go:15 0x47e427 8400 TESTB AL, 0(AX)
main.go:15 0x47e429 eb00 JMP 0x47e42b
main.go:15 0x47e42b 4889442450 MOVQ AX, 0x50(SP)
main.go:15 0x47e430 48c744245804000000 MOVQ $0x4, 0x58(SP)
main.go:15 0x47e439 48c744246004000000 MOVQ $0x4, 0x60(SP)
main.go:15 0x47e442 bb04000000 MOVL $0x4, BX
main.go:15 0x47e447 4889d9 MOVQ BX, CX
main.go:15 0x47e44a e831abffff CALL fmt.Println(SB)
main.go:16 0x47e44f 488bac24a8000000 MOVQ 0xa8(SP), BP
main.go:16 0x47e457 4881c4b0000000 ADDQ $0xb0, SP
main.go:16 0x47e45e c3 RET
main.go:9 0x47e45f 90 NOPL
main.go:9 0x47e460 e81ba7fdff CALL runtime.morestack_noctxt.abi0(SB)
main.go:9 0x47e465 e9f6fdffff JMP main.main(SB)
root@ljolan:/home/ljolan#