Go汇编中PCDATA是什么意思

Gab*_*eim 7 assembly go

我正在使用以下命令将 golang 代码编译为程序集:

go build -gcflags -S .
Run Code Online (Sandbox Code Playgroud)

在汇编代码中,我说了很多行,例如:

PCDATA  $2, $1
Run Code Online (Sandbox Code Playgroud)

这是什么意思?在asm快速指南中,它指出

FUNCDATA 和 PCDATA 指令包含垃圾收集器使用的信息;它们是由编译引入的

但没有很多细节

Mat*_*kin 6

正如您在回答中所述,Go 汇编器快速指南指出:

FUNCDATA 和 PCDATA 指令包含供垃圾收集器使用的信息;它们是由编译器引入的。

Russ Cox 的文章“Go 1.2 运行时符号信息”指出:

类似地,伪指令

PCDATA $3, $45
Run Code Online (Sandbox Code Playgroud)

声明与当前程序计数器关联的索引 3 的值为 45。每个 pcdata 索引(PCDATA $1、PCDATA $2 等)都编码为单独的 pc 值表。就像 funcdata 一样,索引允许为给定函数定义多种 pcdata,并且这些索引也会有一个注册表。

在运行时,运行时可以从 Func 检索具有给定索引的 funcdata 或在给定程序计数器处具有给定索引的 pcdata。pcdata 流可以产生一个 int32,通过引用作为 funcdata 指针检索的相应数据来解释。

在内存中,struct Func 后面紧跟着 npcdata int32s,它给出了 pcdata 表的偏移量;如果 nfuncdata > 0,则 npcdata int32 后面紧跟着一个可能的 int32 间隙以进行对齐,然后 nfuncdata uintptrs 给出 funcdata 值。如果 pcsp、pcfile、pcln 或任何 pcdata 偏移量为零,则该表被视为丢失,并且所有 PC 的值均为 -1。