怎么查看Go中全局变量存储的位置?

创建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调试

  1. gdb main // 调试程序,进入gdb模式
  2. (gdb) b 15 // 第15行打个断点
  3. (gdb) r // 运行
  4. (gdb) set disassembly-flavor intel // 设置汇编语言为intel
  5. (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)内
局部变量在程序运行时分配内存地址。

如何对src文件反汇编?
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# 

参考学习操作

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值