github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/debug/gosym/symtab.go (about) 1 // Copyright 2009 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // gosymパッケージは、gcコンパイラによって生成されたGoバイナリに埋め込まれた 6 // Goのシンボルと行番号のテーブルへのアクセスを実装します。 7 package gosym 8 9 // Symは、単一のシンボルテーブルエントリを表します。 10 type Sym struct { 11 Value uint64 12 Type byte 13 Name string 14 GoType uint64 15 // このシンボルが関数シンボルである場合、対応するFunc 16 Func *Func 17 18 goVersion version 19 } 20 21 // Staticは、このシンボルが静的(ファイルの外部からは見えない)であるかどうかを報告します。 22 func (s *Sym) Static() bool 23 24 // PackageNameは、シンボル名のパッケージ部分を返します。 25 // パッケージ部分がない場合は空の文字列を返します。 26 func (s *Sym) PackageName() string 27 28 // ReceiverNameは、このシンボルのレシーバタイプ名を返します。 29 // レシーバ名がない場合は空の文字列を返します。レシーバ名は、 30 // s.Nameがパッケージ名で完全に指定されている場合にのみ検出されます。 31 func (s *Sym) ReceiverName() string 32 33 // BaseNameは、パッケージ名やレシーバ名を除いたシンボル名を返します。 34 func (s *Sym) BaseName() string 35 36 // Funcは、単一の関数に関する情報を収集します。 37 type Func struct { 38 Entry uint64 39 *Sym 40 End uint64 41 Params []*Sym 42 Locals []*Sym 43 FrameSize int 44 LineTable *LineTable 45 Obj *Obj 46 } 47 48 // Objは、シンボルテーブル内の一連の関数を表します。 49 // 50 // バイナリを別々のObjに分割する具体的な方法は、シンボルテーブル形式の内部詳細です。 51 // 52 // Goの初期のバージョンでは、各ソースファイルが異なるObjになりました。 53 // 54 // Go 1とGo 1.1では、各パッケージはすべてのGoソースに対して1つのObjを生成し、 55 // Cソースファイルごとに1つのObjを生成しました。 56 // 57 // Go 1.2では、プログラム全体に対して単一のObjが存在します。 58 type Obj struct { 59 // Funcsは、Obj内の関数のリストです。 60 Funcs []Func 61 62 // Go 1.1以前では、PathsはObjを生成したソースファイル名に対応するシンボルのリストです。 63 // Go 1.2では、Pathsはnilです。 64 // ソースファイルのリストを取得するには、Table.Filesのキーを使用します。 65 Paths []Sym 66 } 67 68 // TableはGoのシンボルテーブルを表します。プログラムからデコードされたすべての 69 // シンボルを保存し、シンボル、名前、アドレス間の変換を行うメソッドを提供します。 70 type Table struct { 71 Syms []Sym 72 Funcs []Func 73 Files map[string]*Obj 74 Objs []Obj 75 76 go12line *LineTable 77 } 78 79 // NewTableはGoのシンボルテーブル(ELFの".gosymtab"セクション)をデコードし、 80 // メモリ内表現を返します。 81 // Go 1.3以降、Goのシンボルテーブルにはシンボルデータが含まれなくなりました。 82 func NewTable(symtab []byte, pcln *LineTable) (*Table, error) 83 84 // PCToFuncは、プログラムカウンタpcを含む関数を返します。 85 // そのような関数がない場合はnilを返します。 86 func (t *Table) PCToFunc(pc uint64) *Func 87 88 // PCToLineは、プログラムカウンタに対する行番号情報を検索します。 89 // 情報がない場合は、fn == nilを返します。 90 func (t *Table) PCToLine(pc uint64) (file string, line int, fn *Func) 91 92 // LineToPCは、指定されたファイルの指定された行で最初のプログラムカウンタを検索します。 93 // この行を検索中にエラーが発生した場合、[UnknownPathError] または [UnknownLineError] を返します。 94 func (t *Table) LineToPC(file string, line int) (pc uint64, fn *Func, err error) 95 96 // LookupSymは、指定された名前を持つテキスト、データ、またはbssシンボルを返します。 97 // そのようなシンボルが見つからない場合はnilを返します。 98 func (t *Table) LookupSym(name string) *Sym 99 100 // LookupFuncは、指定された名前を持つテキスト、データ、またはbssシンボルを返します。 101 // そのようなシンボルが見つからない場合はnilを返します。 102 func (t *Table) LookupFunc(name string) *Func 103 104 // SymByAddrは、指定されたアドレスで開始するテキスト、データ、またはbssシンボルを返します。 105 func (t *Table) SymByAddr(addr uint64) *Sym 106 107 // UnknownFileErrorは、シンボルテーブル内で特定のファイルを見つけることができなかったことを表すエラーです。 108 type UnknownFileError string 109 110 func (e UnknownFileError) Error() string 111 112 // UnknownLineErrorは、行をプログラムカウンタにマッピングできなかったことを表すエラーです。 113 // これは、行がファイルの範囲を超えているか、指定された行にコードがないためです。 114 type UnknownLineError struct { 115 File string 116 Line int 117 } 118 119 func (e *UnknownLineError) Error() string 120 121 // DecodingError represents an error during the decoding of 122 // the symbol table. 123 type DecodingError struct { 124 off int 125 msg string 126 val any 127 } 128 129 func (e *DecodingError) Error() string