Documentation
¶
Overview ¶
dwarfパッケージは、実行可能ファイルからロードされたDWARFデバッグ情報へのアクセスを提供します。 これは、DWARF 2.0標準で定義されています。 http://dwarfstd.org/doc/dwarf-2.0.0.pdf
セキュリティ ¶
このパッケージは、敵対的な入力に対して強化されていないため、https://go.dev/security/policy の範囲外です。 特に、オブジェクトファイルを解析する際には基本的な検証しか行われません。 そのため、信頼できない入力を解析する場合は注意が必要です。 不正なファイルを解析すると、大量のリソースを消費したり、パニックを引き起こす可能性があるためです。
Index ¶
- Variables
- type AddrType
- type ArrayType
- type Attr
- type BasicType
- type BoolType
- type CharType
- type Class
- type CommonType
- type ComplexType
- type Data
- func (d *Data) AddSection(name string, contents []byte) error
- func (d *Data) AddTypes(name string, types []byte) error
- func (d *Data) LineReader(cu *Entry) (*LineReader, error)
- func (d *Data) Ranges(e *Entry) ([][2]uint64, error)
- func (d *Data) Reader() *Reader
- func (d *Data) Type(off Offset) (Type, error)
- type DecodeError
- type DotDotDotType
- type Entry
- type EnumType
- type EnumValue
- type Field
- type FloatType
- type FuncType
- type IntType
- type LineEntry
- type LineFile
- type LineReader
- type LineReaderPos
- type Offset
- type PtrType
- type QualType
- type Reader
- type StructField
- type StructType
- type Tag
- type Type
- type TypedefType
- type UcharType
- type UintType
- type UnspecifiedType
- type UnsupportedType
- type VoidType
Constants ¶
This section is empty.
Variables ¶
var ErrUnknownPC = errors.New("ErrUnknownPC")
ErrUnknownPCは、LineReader.ScanPCが行テーブルのエントリによってカバーされていないPCを検出した場合に返されるエラーです。
Functions ¶
This section is empty.
Types ¶
type ArrayType ¶
type ArrayType struct {
CommonType
Type Type
StrideBitSize int64
Count int64
}
ArrayTypeは、固定サイズの配列型を表します。
type Attr ¶
type Attr uint32
Attrは、[Entry.Field] 内の属性タイプを識別します。
const ( AttrSibling Attr = 0x01 AttrLocation Attr = 0x02 AttrName Attr = 0x03 AttrOrdering Attr = 0x09 AttrByteSize Attr = 0x0B AttrBitOffset Attr = 0x0C AttrBitSize Attr = 0x0D AttrStmtList Attr = 0x10 AttrLowpc Attr = 0x11 AttrHighpc Attr = 0x12 AttrLanguage Attr = 0x13 AttrDiscr Attr = 0x15 AttrDiscrValue Attr = 0x16 AttrVisibility Attr = 0x17 AttrImport Attr = 0x18 AttrStringLength Attr = 0x19 AttrCommonRef Attr = 0x1A AttrCompDir Attr = 0x1B AttrConstValue Attr = 0x1C AttrContainingType Attr = 0x1D AttrDefaultValue Attr = 0x1E AttrInline Attr = 0x20 AttrIsOptional Attr = 0x21 AttrLowerBound Attr = 0x22 AttrProducer Attr = 0x25 AttrPrototyped Attr = 0x27 AttrReturnAddr Attr = 0x2A AttrStartScope Attr = 0x2C AttrStrideSize Attr = 0x2E AttrUpperBound Attr = 0x2F AttrAbstractOrigin Attr = 0x31 AttrAccessibility Attr = 0x32 AttrAddrClass Attr = 0x33 AttrArtificial Attr = 0x34 AttrBaseTypes Attr = 0x35 AttrCalling Attr = 0x36 AttrCount Attr = 0x37 AttrDataMemberLoc Attr = 0x38 AttrDeclColumn Attr = 0x39 AttrDeclFile Attr = 0x3A AttrDeclLine Attr = 0x3B AttrDeclaration Attr = 0x3C AttrDiscrList Attr = 0x3D AttrEncoding Attr = 0x3E AttrExternal Attr = 0x3F AttrFrameBase Attr = 0x40 AttrFriend Attr = 0x41 AttrIdentifierCase Attr = 0x42 AttrMacroInfo Attr = 0x43 AttrNamelistItem Attr = 0x44 AttrPriority Attr = 0x45 AttrSegment Attr = 0x46 AttrSpecification Attr = 0x47 AttrStaticLink Attr = 0x48 AttrType Attr = 0x49 AttrUseLocation Attr = 0x4A AttrVarParam Attr = 0x4B AttrVirtuality Attr = 0x4C AttrVtableElemLoc Attr = 0x4D // 以下はDWARF 3で新しくなったものです。 AttrAllocated Attr = 0x4E AttrAssociated Attr = 0x4F AttrDataLocation Attr = 0x50 AttrStride Attr = 0x51 AttrEntrypc Attr = 0x52 AttrUseUTF8 Attr = 0x53 AttrExtension Attr = 0x54 AttrRanges Attr = 0x55 AttrTrampoline Attr = 0x56 AttrCallColumn Attr = 0x57 AttrCallFile Attr = 0x58 AttrCallLine Attr = 0x59 AttrDescription Attr = 0x5A AttrBinaryScale Attr = 0x5B AttrDecimalScale Attr = 0x5C AttrSmall Attr = 0x5D AttrDecimalSign Attr = 0x5E AttrDigitCount Attr = 0x5F AttrPictureString Attr = 0x60 AttrMutable Attr = 0x61 AttrThreadsScaled Attr = 0x62 AttrExplicit Attr = 0x63 AttrObjectPointer Attr = 0x64 AttrEndianity Attr = 0x65 AttrElemental Attr = 0x66 AttrPure Attr = 0x67 AttrRecursive Attr = 0x68 // 以下はDWARF 4で新しくなったものです。 AttrSignature Attr = 0x69 AttrMainSubprogram Attr = 0x6A AttrDataBitOffset Attr = 0x6B AttrConstExpr Attr = 0x6C AttrEnumClass Attr = 0x6D AttrLinkageName Attr = 0x6E // 以下はDWARF 5で新しくなったものです。 AttrStringLengthBitSize Attr = 0x6F AttrStringLengthByteSize Attr = 0x70 AttrRank Attr = 0x71 AttrStrOffsetsBase Attr = 0x72 AttrAddrBase Attr = 0x73 AttrRnglistsBase Attr = 0x74 AttrDwoName Attr = 0x76 AttrReference Attr = 0x77 AttrRvalueReference Attr = 0x78 AttrMacros Attr = 0x79 AttrCallAllCalls Attr = 0x7A AttrCallAllSourceCalls Attr = 0x7B AttrCallAllTailCalls Attr = 0x7C AttrCallReturnPC Attr = 0x7D AttrCallValue Attr = 0x7E AttrCallOrigin Attr = 0x7F AttrCallParameter Attr = 0x80 AttrCallPC Attr = 0x81 AttrCallTailCall Attr = 0x82 AttrCallTarget Attr = 0x83 AttrCallTargetClobbered Attr = 0x84 AttrCallDataLocation Attr = 0x85 AttrCallDataValue Attr = 0x86 AttrNoreturn Attr = 0x87 AttrAlignment Attr = 0x88 AttrExportSymbols Attr = 0x89 AttrDeleted Attr = 0x8A AttrDefaulted Attr = 0x8B AttrLoclistsBase Attr = 0x8C )
type BasicType ¶
type BasicType struct {
CommonType
BitSize int64
BitOffset int64
DataBitOffset int64
}
BasicTypeは、すべての基本型に共通するフィールドを保持します。
BitSize / BitOffset / DataBitOffsetフィールドの解釈に関する詳細については、StructField のドキュメントを参照してください。
type Class ¶ added in v1.5.0
type Class int
Classは、属性値のDWARF 4クラスです。
一般的に、特定の属性の値は、DWARFによって定義されたいくつかの可能なクラスのうちの1つを取ることができます。 それぞれのクラスは、属性のわずかに異なる解釈につながります。
DWARFバージョン4は、以前のDWARFバージョンよりも属性値クラスを細かく区別します。 リーダーは、以前のDWARFバージョンの粗いクラスを、適切なDWARF 4クラスに明確に区別します。 たとえば、DWARF 2は、定数だけでなくすべてのタイプのセクションオフセットに対して「constant」を使用しますが、 リーダーは、セクションオフセットを参照するDWARF 2ファイルの属性を、Class*Ptrクラスの1つに正規化します。 これらのクラスは、DWARF 3でのみ定義されていたにもかかわらずです。
const ( // ClassUnknownは、未知のDWARFクラスの値を表します。 ClassUnknown Class = iota // ClassAddressは、ターゲットマシン上のアドレスであるuint64型の値を表します。 ClassAddress // ClassBlockは、属性に依存する[]byte型の値を表します。 ClassBlock // ClassConstantは、定数であるint64型の値を表します。 // この定数の解釈は、属性に依存します。 ClassConstant // ClassExprLocは、エンコードされたDWARF式またはロケーション記述を含む[]byte型の値を表します。 ClassExprLoc // ClassFlagは、bool型の値を表します。 ClassFlag // ClassLinePtrは、int64オフセットである値を表します。 // このオフセットは、"line"セクション内の位置を指します。 ClassLinePtr // ClassLocListPtrは、int64オフセットである値を表します。 // このオフセットは、"loclist"セクション内の位置を指します。 ClassLocListPtr // ClassMacPtrは、int64オフセットである値を表します。 // このオフセットは、"mac"セクション内の位置を指します。 ClassMacPtr // ClassRangeListPtrは、int64オフセットである値を表します。 // このオフセットは、"rangelist"セクション内の位置を指します。 ClassRangeListPtr // ClassReferenceは、infoセクション内のEntryのオフセットを表す値を表します。 // (Reader.Seekで使用するため)。 // DWARF仕様は、ClassReferenceとClassReferenceSigをクラス"reference"に結合します。 ClassReference // ClassReferenceSigは、型Entryを参照するuint64型のシグネチャを表す値を表します。 ClassReferenceSig // ClassStringは、文字列を表す値を表します。 // コンパイルユニットがAttrUseUTF8フラグ(強く推奨)を指定している場合、 // 文字列値はUTF-8でエンコードされます。それ以外の場合、エンコーディングは未指定です。 ClassString // ClassReferenceAltは、代替オブジェクトファイルのDWARF "info"セクション内のオフセットを表すint64型の値を表します。 ClassReferenceAlt // ClassStringAltは、代替オブジェクトファイルのDWARF文字列セクション内のオフセットを表すint64型の値を表します。 ClassStringAlt // ClassAddrPtrは、"addr"セクション内のint64オフセットである値を表します。 ClassAddrPtr // ClassLocListは、"loclists"セクション内のint64オフセットである値を表します。 ClassLocList // ClassRngListは、"rnglists"セクションのベースからのuint64オフセットを表す値を表します。 ClassRngList // ClassRngListsPtrは、"rnglists"セクション内のint64オフセットである値を表します。 // これらは、ClassRngList値のベースとして使用されます。 ClassRngListsPtr // ClassStrOffsetsPtrは、"str_offsets"セクション内のint64オフセットである値を表します。 ClassStrOffsetsPtr )
type CommonType ¶
CommonTypeは、複数の型で共通のフィールドを保持します。 フィールドが特定の型に対して不明または適用できない場合、 ゼロ値が使用されます。
func (*CommonType) Common ¶
func (c *CommonType) Common() *CommonType
func (*CommonType) Size ¶
func (c *CommonType) Size() int64
type Data ¶
type Data struct {
// contains filtered or unexported fields
}
Dataは、実行可能ファイル(例えば、ELFまたはMach-O実行可能ファイル)からロードされた DWARFデバッグ情報を表します。
func New ¶
Newは、指定されたパラメータから初期化された新しい Data オブジェクトを返します。 この関数を直接呼び出す代わりに、クライアントは通常、適切なパッケージ debug/elf、debug/macho、または debug/pe のFile型のDWARFメソッドを使用する必要があります。
[]byte引数は、オブジェクトファイルの対応するデバッグセクションからのデータです。 たとえば、ELFオブジェクトの場合、abbrevは".debug_abbrev"セクションの内容です。
func (*Data) AddSection ¶ added in v1.14.0
AddSectionは、名前で指定された別のDWARFセクションを追加します。 名前は、".debug_addr"、".debug_str_offsets"などのDWARFセクション名である必要があります。 このアプローチは、DWARF 5以降で追加された新しいDWARFセクションに使用されます。
func (*Data) AddTypes ¶ added in v1.3.0
AddTypesは、DWARFデータに1つの.debug_typesセクションを追加します。 DWARFバージョン4のデバッグ情報を持つ典型的なオブジェクトには、複数の.debug_typesセクションがあります。 名前はエラー報告のみに使用され、1つの.debug_typesセクションを別のセクションと区別するために使用されます。
func (*Data) LineReader ¶ added in v1.5.0
func (d *Data) LineReader(cu *Entry) (*LineReader, error)
LineReaderは、TagCompileUnit を持つ Entry cuの行テーブルのための新しいリーダーを返します。
このコンパイルユニットに行テーブルがない場合、nil、nilを返します。
func (*Data) Ranges ¶ added in v1.7.0
Rangesは、eによってカバーされるPC範囲、つまり[low, high)のペアのスライスを返します。 TagCompileUnit や TagSubprogram など、一部のエントリタイプのみがPC範囲を持っています。 それ以外の場合、エラーを返さずにnilを返します。
type DecodeError ¶
func (DecodeError) Error ¶
func (e DecodeError) Error() string
type DotDotDotType ¶
type DotDotDotType struct {
CommonType
}
DotDotDotTypeは、可変長の...関数パラメータを表します。
func (*DotDotDotType) String ¶
func (t *DotDotDotType) String() string
type Entry ¶
エントリは、属性/値のペアのシーケンスです。
type EnumType ¶
type EnumType struct {
CommonType
EnumName string
Val []*EnumValue
}
EnumTypeは、列挙型を表します。 ネイティブの整数型の唯一の指標は、CommonType 内のByteSizeです。
type Field ¶
Fieldは、Entry 内の単一の属性/値ペアです。
値は、DWARFによって定義されたいくつかの「属性クラス」のうちの1つです。 各クラスに対応するGoの型は次のとおりです。
DWARFクラス Goの型 クラス ----------- ------- ----- address uint64 ClassAddress block []byte ClassBlock constant int64 ClassConstant flag bool ClassFlag reference to info dwarf.Offset ClassReference to type unit uint64 ClassReferenceSig string string ClassString exprloc []byte ClassExprLoc lineptr int64 ClassLinePtr loclistptr int64 ClassLocListPtr macptr int64 ClassMacPtr rangelistptr int64 ClassRangeListPtr
識別できないまたはベンダー定義の属性の場合、Class は ClassUnknown になります。
type FuncType ¶
type FuncType struct {
CommonType
ReturnType Type
ParamType []Type
}
FuncTypeは、関数の型を表します。
type LineEntry ¶ added in v1.5.0
type LineEntry struct {
// Addressは、コンパイラによって生成されたマシン命令のプログラムカウンター値です。
// このLineEntryは、Addressから次のLineEntryのAddressの直前までの各命令に適用されます。
Address uint64
// OpIndexは、VLIW命令内の操作のインデックスです。
// 最初の操作のインデックスは0です。非VLIWアーキテクチャの場合、常に0になります。
// AddressとOpIndexは、命令ストリーム内の任意の個々の操作を参照できる操作ポインターを形成します。
OpIndex int
// Fileは、これらの命令に対応するソースファイルです。
File *LineFile
// Lineは、これらの命令に対応するソースコードの行番号です。
// 行番号は1から始まります。これらの命令がどのソース行にも関連付けられていない場合は、0になる場合があります。
Line int
// Columnは、これらの命令のソース行内の列番号です。
// 列番号は1から始まります。行の「左端」を示すために0になる場合があります。
Column int
// IsStmtは、Addressが推奨されるブレークポイントの場所であることを示します。
// 例えば、行の始まり、文の始まり、または文の明確な部分などです。
IsStmt bool
// BasicBlockは、Addressが基本ブロックの開始であることを示します。
BasicBlock bool
// PrologueEndは、Addressが、含まれる関数へのエントリにブレークポイントを設定するために、
// 実行を一時停止する必要があるPCの1つ(可能性がある)であることを示します。
//
// DWARF 3で追加されました。
PrologueEnd bool
// EpilogueBeginは、Addressが、この関数からの終了時にブレークポイントを設定するために、
// 実行を一時停止する必要があるPCの1つ(可能性がある)であることを示します。
//
// DWARF 3で追加されました。
EpilogueBegin bool
// ISAは、これらの命令の命令セットアーキテクチャを表します。
// 可能なISA値は、適用可能なABI仕様によって定義される必要があります。
//
// DWARF 3で追加されました。
ISA int
// Discriminatorは、これらの命令が属するブロックを示す任意の整数です。
// これにより、同じソースファイル、行、列を持つ複数のブロックを区別できます。
// 特定のソース位置に1つのブロックしか存在しない場合、0にする必要があります。
//
// DWARF 3で追加されました。
Discriminator int
// EndSequenceは、Addressがターゲットマシン命令のシーケンスの終わりの直後の最初のバイトであることを示します。
// 設定されている場合、このフィールドとAddressフィールドのみが有意です。
// 行番号テーブルには、複数の可能性のある不連続な命令シーケンスの情報が含まれる場合があります。
// 行テーブルの最後のエントリには、常にEndSequenceが設定されている必要があります。
EndSequence bool
}
LineEntryは、DWARF行テーブル内の行を表します。
type LineReader ¶ added in v1.5.0
type LineReader struct {
// contains filtered or unexported fields
}
LineReaderは、単一のコンパイルユニットのDWARF「line」セクションから LineEntry 構造体のシーケンスを読み取ります。 LineEntry は、PCの増加順に発生し、各 LineEntry は、その LineEntry のPCから次の LineEntry のPCの直前までの命令のメタデータを提供します。 最後のエントリには、[LineEntry.EndSequence] フィールドが設定されます。
func (*LineReader) Files ¶ added in v1.14.0
func (r *LineReader) Files() []*LineFile
Filesは、現在の行テーブルの位置に基づいて、このコンパイルユニットのファイル名テーブルを返します。 ファイル名テーブルは、AttrDeclFile などのこのコンパイルユニットの属性から参照される場合があります。
Entry 0は常にnilです。なぜなら、ファイルインデックス0は「ファイルなし」を表すからです。
コンパイルユニットのファイル名テーブルは固定されていません。Filesは、 行テーブルの現在の位置に基づいてファイルテーブルを返します。 これにより、行テーブルの以前の位置のファイルテーブルよりもエントリが多く含まれる場合がありますが、 既存のエントリは変更されません。
func (*LineReader) Next ¶ added in v1.5.0
func (r *LineReader) Next(entry *LineEntry) error
Nextは、この行テーブルの次の行を*entryに設定し、次の行に移動します。 もうエントリがなく、行テーブルが適切に終了している場合、io.EOF を返します。
行は常にentry.Addressの増加順に並んでいますが、entry.Lineは前後に移動する場合があります。
func (*LineReader) Reset ¶ added in v1.5.0
func (r *LineReader) Reset()
Resetは、行テーブルリーダーを行テーブルの先頭に再配置します。
func (*LineReader) Seek ¶ added in v1.5.0
func (r *LineReader) Seek(pos LineReaderPos)
Seekは、LineReader.Tell によって返された位置に行テーブルリーダーを復元します。
引数posは、この行テーブルの LineReader.Tell 呼び出しによって返されたものである必要があります。
func (*LineReader) SeekPC ¶ added in v1.5.0
func (r *LineReader) SeekPC(pc uint64, entry *LineEntry) error
SeekPCは、pcを含む LineEntry を*entryに設定し、 行テーブルの次のエントリに位置を設定します。 必要に応じて、pcを検索するために後方にシークします。
pcがこの行テーブルのエントリによってカバーされていない場合、 SeekPCは ErrUnknownPC を返します。この場合、*entryと最終的なシーク位置は未指定です。
DWARF行テーブルは、順次前方スキャンのみを許可します。 したがって、最悪の場合、これには行テーブルのサイズに比例する時間がかかります。 呼び出し側が繰り返し高速なPC検索を行いたい場合は、 適切な行テーブルのインデックスを構築する必要があります。
func (*LineReader) Tell ¶ added in v1.5.0
func (r *LineReader) Tell() LineReaderPos
Tellは、行テーブル内の現在の位置を返します。
type LineReaderPos ¶ added in v1.5.0
type LineReaderPos struct {
// contains filtered or unexported fields
}
LineReaderPosは、行テーブル内の位置を表します。
type QualType ¶
type QualType struct {
CommonType
Qual string
Type Type
}
QualTypeは、C/C++の「const」、「restrict」、または「volatile」修飾子を持つ型を表します。
type Reader ¶
type Reader struct {
// contains filtered or unexported fields
}
Readerは、DWARF「info」セクションから Entry 構造体を読み取ることを可能にします。 Entry 構造体はツリー形式で配置されています。Reader.Next 関数は、 ツリーの先行順序の走査から連続するエントリを返します。 エントリに子がある場合、そのChildrenフィールドはtrueになり、子は Tag 0の Entry で終了します。
func (*Reader) AddressSize ¶ added in v1.5.0
AddressSizeは、現在のコンパイルユニットのアドレスのバイト数を返します。
func (*Reader) Next ¶
Nextは、エンコードされたエントリストリームから次のエントリを読み取ります。 セクションの終わりに達した場合、nil、nilを返します。 現在のオフセットが無効であるか、オフセットのデータを有効な Entry としてデコードできない場合、エラーを返します。
func (*Reader) SeekPC ¶ added in v1.7.0
SeekPCは、pcを含むコンパイルユニットの Entry を返し、 そのユニットの子を読み取るためにリーダーを配置します。 pcがどのユニットにも含まれていない場合、SeekPCは ErrUnknownPC を返し、 リーダーの位置は未定義です。
コンパイルユニットが実行可能ファイルの複数の領域を記述できるため、 SeekPCは最悪の場合、すべてのコンパイルユニットのすべての範囲を検索する必要があります。 SeekPCの各呼び出しは、前回の呼び出しのコンパイルユニットから検索を開始するため、 一般的には、PCをソートすると、連続する高速なPC検索を行う場合に効果的です。 呼び出し元が繰り返し高速なPC検索を行いたい場合は、Rangesメソッドを使用して適切なインデックスを構築する必要があります。
func (*Reader) SkipChildren ¶
func (r *Reader) SkipChildren()
SkipChildrenは、Reader.Next によって返された最後の Entry に関連付けられた子エントリをスキップします。 その Entry に子がない場合、または Reader.Next が呼び出されていない場合、SkipChildrenは何もしません。
type StructField ¶
type StructField struct {
Name string
Type Type
ByteOffset int64
ByteSize int64
BitOffset int64
DataBitOffset int64
BitSize int64
}
StructFieldは、構造体、共用体、またはC++クラス型のフィールドを表します。
ビットフィールド ¶
BitSize、BitOffset、DataBitOffsetフィールドは、C/C++のstruct/union/class型でビットフィールドとして宣言されたデータメンバーのビットサイズとオフセットを記述します。
BitSizeは、ビットフィールドのビット数です。
DataBitOffsetが0以外の場合、それは、 ビットフィールドの開始位置から囲むエンティティ(例:含まれるstruct/class/union)の開始位置までのビット数です。 これは、DWARF 4で導入されたDW_AT_data_bit_offset DWARF属性に対応します。
BitOffsetが0以外の場合、それは、 ビットフィールドを保持するストレージユニットの最上位ビットからビットフィールドの最上位ビットまでのビット数です。 ここで「ストレージユニット」とは、ビットフィールドの前の型名です(フィールド「unsigned x:17」の場合、ストレージユニットは「unsigned」です)。 BitOffsetの値は、システムのエンディアンによって異なる場合があります。 BitOffsetは、DWARF 4で廃止され、DWARF 5で削除されたDW_AT_bit_offset DWARF属性に対応します。
DataBitOffsetとBitOffsetのうち、最大1つだけが非ゼロになります。 DataBitOffset/BitOffsetは、BitSizeが非ゼロの場合にのみ非ゼロになります。 Cコンパイラがどちらを使用するかは、コンパイラのバージョンとコマンドラインオプションに依存します。
以下は、C/C++のビットフィールドの使用例と、DWARFビットオフセット情報の期待値の例です。 このコードを考えてみましょう。
struct S {
int q;
int j:5;
int k:6;
int m:5;
int n:8;
} s;
上記のコードに対して、GCC 8を使用している場合、DW_AT_bit_offsetの値は次のようになることが期待されます。
Little | Big
Endian | Endian
|
"j": 27 | 0
"k": 21 | 5
"m": 16 | 11
"n": 8 | 16
上記のように、j/k/m/nの含まれるストレージユニットに対するオフセットのみが考慮されます。これらの値は、含まれる構造体の前のデータメンバーのサイズに基づいて変化することはありません。
コンパイラがDW_AT_data_bit_offsetを出力する場合、期待される値は次のようになります。
"j": 32 "k": 37 "m": 43 "n": 48
ここで、"j"の値32は、ビットフィールドが他のデータメンバーに続くことを反映しています(DW_AT_data_bit_offset値は、含まれる構造体の開始位置を基準としています)。 したがって、DW_AT_data_bit_offset値は、多数のフィールドを持つ構造体ではかなり大きくなる可能性があります。
DWARFは、ビットサイズとビットオフセットがゼロでない基本型の可能性も許容しているため、これらの情報は基本型に対してもキャプチャされます。 ただし、主流の言語を使用してこの動作をトリガーすることはできないことに注意する価値があります。
type StructType ¶
type StructType struct {
CommonType
StructName string
Kind string
Field []*StructField
Incomplete bool
}
StructTypeは、構造体、共用体、またはC++クラス型を表します。
func (*StructType) Defn ¶
func (t *StructType) Defn() string
func (*StructType) String ¶
func (t *StructType) String() string
type Tag ¶
type Tag uint32
Tagは、Entry の分類(タイプ)です。
const ( TagArrayType Tag = 0x01 TagClassType Tag = 0x02 TagEntryPoint Tag = 0x03 TagEnumerationType Tag = 0x04 TagFormalParameter Tag = 0x05 TagImportedDeclaration Tag = 0x08 TagLabel Tag = 0x0A TagLexDwarfBlock Tag = 0x0B TagMember Tag = 0x0D TagPointerType Tag = 0x0F TagReferenceType Tag = 0x10 TagCompileUnit Tag = 0x11 TagStringType Tag = 0x12 TagStructType Tag = 0x13 TagSubroutineType Tag = 0x15 TagTypedef Tag = 0x16 TagUnionType Tag = 0x17 TagUnspecifiedParameters Tag = 0x18 TagVariant Tag = 0x19 TagCommonDwarfBlock Tag = 0x1A TagCommonInclusion Tag = 0x1B TagInheritance Tag = 0x1C TagInlinedSubroutine Tag = 0x1D TagModule Tag = 0x1E TagPtrToMemberType Tag = 0x1F TagSetType Tag = 0x20 TagSubrangeType Tag = 0x21 TagWithStmt Tag = 0x22 TagAccessDeclaration Tag = 0x23 TagBaseType Tag = 0x24 TagCatchDwarfBlock Tag = 0x25 TagConstType Tag = 0x26 TagConstant Tag = 0x27 TagEnumerator Tag = 0x28 TagFileType Tag = 0x29 TagFriend Tag = 0x2A TagNamelist Tag = 0x2B TagNamelistItem Tag = 0x2C TagPackedType Tag = 0x2D TagSubprogram Tag = 0x2E TagTemplateTypeParameter Tag = 0x2F TagTemplateValueParameter Tag = 0x30 TagThrownType Tag = 0x31 TagTryDwarfBlock Tag = 0x32 TagVariantPart Tag = 0x33 TagVariable Tag = 0x34 TagVolatileType Tag = 0x35 // 以下はDWARF 3で新しくなったものです。 TagDwarfProcedure Tag = 0x36 TagRestrictType Tag = 0x37 TagInterfaceType Tag = 0x38 TagNamespace Tag = 0x39 TagImportedModule Tag = 0x3A TagUnspecifiedType Tag = 0x3B TagPartialUnit Tag = 0x3C TagImportedUnit Tag = 0x3D TagMutableType Tag = 0x3E TagCondition Tag = 0x3F // 以下はDWARF 4で新しくなったものです。 TagTypeUnit Tag = 0x41 TagRvalueReferenceType Tag = 0x42 TagTemplateAlias Tag = 0x43 // 以下はDWARF 5で新しくなったものです。 TagCoarrayType Tag = 0x44 TagGenericSubrange Tag = 0x45 TagDynamicType Tag = 0x46 TagAtomicType Tag = 0x47 TagCallSite Tag = 0x48 TagCallSiteParameter Tag = 0x49 TagSkeletonUnit Tag = 0x4A TagImmutableType Tag = 0x4B )
type Type ¶
type Type interface {
Common() *CommonType
String() string
Size() int64
}
Typeは、通常、特定のType構造体(CharType、StructType など)のいずれかへのポインタを表します。
type TypedefType ¶
type TypedefType struct {
CommonType
Type Type
}
TypedefTypeは、名前付き型を表します。
func (*TypedefType) Size ¶
func (t *TypedefType) Size() int64
func (*TypedefType) String ¶
func (t *TypedefType) String() string
type UnspecifiedType ¶ added in v1.4.0
type UnspecifiedType struct {
BasicType
}
UnspecifiedTypeは、暗黙的な、不明な、曖昧な、または存在しない型を表します。
type UnsupportedType ¶ added in v1.13.0
type UnsupportedType struct {
CommonType
Tag Tag
}
UnsupportedTypeは、サポートされていない型に遭遇した場合に返されるプレースホルダーです。
func (*UnsupportedType) String ¶ added in v1.13.0
func (t *UnsupportedType) String() string