go汇编

go汇编传送门:

首先创建一个pkg.go文件,内容如下:

1
2
package pkg
var Id = 9527

用以下命令查看的Go语言程序对应的伪汇编代码:

1
2
3
4
5
go tool compile -S pkg.go
# 或
go build -gcflags=-S pkg.go
# -N关闭内联汇编
go build -gcflags="-S -N" pkg.go

其中gcflags,为go compile flags。关于gcflags的使用帮助可以使用go help build查看。查看gcflags参数可用go help compile;运行命令我们可以看到下面的arm64汇编输出:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# command-line-arguments
go.cuinfo.producer.command-line-arguments SDWARFCUINFO dupok size=0
        0x0000 2d 73 68 61 72 65 64                             -shared
go.cuinfo.packagename.command-line-arguments SDWARFCUINFO dupok size=0
        0x0000 70 6b 67                                         pkg
"".Id SNOPTRDATA size=8
        0x0000 37 25 00 00 00 00 00 00                          7%......
go.info.command-line-arguments.Id SDWARFVAR dupok size=42
        0x0000 08 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 2d 61 72  .command-line-ar
        0x0010 67 75 6d 65 6e 74 73 2e 49 64 00 09 03 00 00 00  guments.Id......
        0x0020 00 00 00 00 00 00 00 00 00 01                    ..........
        rel 29+8 t=1 "".Id+0
        rel 37+4 t=31 go.info.int+0

PS: amd64汇编要简单很多:

1
2
3
4
5
# command-line-arguments
go.cuinfo.packagename.command-line-arguments SDWARFCUINFO dupok size=0
	0x0000 70 6b 67                                         pkg
"".Id SNOPTRDATA size=8
	0x0000 37 25 00 00 00 00 00 00                          7%......

逐段分析汇编: 1.

1
2
go.cuinfo.producer.command-line-arguments SDWARFCUINFO dupok size=0
        0x0000 2d 73 68 61 72 65 64                             -shared

go.cuinfo.来自(dwarf.go)[https://github.com/golang/go/blob/master/src/cmd/internal/dwarf/dwarf.go]代码中的定义:

1
2
3
// CUInfoPrefix is the prefix for symbols containing information to
// populate the DWARF compilation unit info entries.
const CUInfoPrefix = "go.cuinfo."

dwraf全称debugging with attributed record formats。

  • dwarf包的说明:

Package dwarf provides access to DWARF debugging information loaded from executable files, as defined in the DWARF 2.0 Standard at http://dwarfstd.org/doc/dwarf-2.0.0.pdf

  • (dwarf wiki)[https://en.wikipedia.org/wiki/DWARF]
  • dwarf 相关资料(ibm)[https://developer.ibm.com/articles/au-dwarf-debug-format/]
  • (Parsing Go Binary DWARF Info)[https://www.grant.pizza/blog/dwarf/] 关于dwraf的说明我们以后可以单独写一篇文章,这里大致了解其为一种广泛使用的标准化调试数据格式。 SDWARFCUINFO即为 section dwarf cuinfo,dupok定义在(textflag.h)[https://github.com/golang/go/blob/master/src/runtime/textflag.h]中,该文件定义了附加到各种函数和数据对象的标志。编译器、汇编器和链接器都必须就这些值达成一致。(待进一步说明) 0x0000 2d 73 68 61 72 65 64为"-shared"的16进制ascii码,下pkg同。同样的"7%……“为"0x0000 37 25 00 00 00 00 00 00"的表示。
Built with Hugo
主题 StackJimmy 设计