Пакет dwarf
Обзор
Пакет dwarf предоставляет доступ к отладочной информации DWARF, загруженной из исполняемых файлов и определённой стандартом DWARF 2.0 по адресу http://dwarfstd.org/doc/dwarf-2.0.0.pdf.
Безопасность
Этот пакет не предназначен для защиты от враждебных входных данных и не входит в область действия https://go.dev/security/policy. В частности, при разборе объектных файлов выполняется только базовая проверка. Поэтому при разборе недоверенных входных данных следует соблюдать осторожность: разбор некорректных файлов может потребовать значительных ресурсов или вызвать панику.
Указатель
Файлы пакета
attr_string.go buf.go class_string.go const.go entry.go line.go open.go tag_string.go type.go typeunit.go unit.go
Переменные
ErrUnknownPC — ошибка, возвращаемая LineReader.ScanPC, если искомый PC не покрывается ни одной записью таблицы строк.
var ErrUnknownPC = errors.New("ErrUnknownPC") тип AddrType
AddrType представляет тип машинного адреса.
type AddrType struct {
BasicType
}
тип ArrayType
ArrayType представляет тип массива фиксированного размера.
type ArrayType struct {
CommonType
Type Type
StrideBitSize int64 // if > 0, number of bits to hold each element
Count int64 // if == -1, an incomplete array, like char x[].
}
func (*ArrayType) Size
func (t *ArrayType) Size() int64
func (*ArrayType) String
func (t *ArrayType) String() string
тип Attr
Attr определяет тип атрибута в DWARF Entry.Field.
type Attr uint32
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
// The following are new in 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
// The following are new in DWARF 4.
AttrSignature Attr = 0x69
AttrMainSubprogram Attr = 0x6A
AttrDataBitOffset Attr = 0x6B
AttrConstExpr Attr = 0x6C
AttrEnumClass Attr = 0x6D
AttrLinkageName Attr = 0x6E
// The following are new in 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
) func (Attr) GoString
func (a Attr) GoString() string
func (Attr) String
func (i Attr) String() string
тип BasicType
BasicType содержит поля, общие для всех базовых типов.
Дополнительные сведения об интерпретации полей BitSize/BitOffset/DataBitOffset см. в документации к StructField.
type BasicType struct {
CommonType
BitSize int64
BitOffset int64
DataBitOffset int64 // Go 1.18
}
func (*BasicType) Basic
func (b *BasicType) Basic() *BasicType
func (*BasicType) String
func (t *BasicType) String() string
тип BoolType
BoolType представляет логический тип.
type BoolType struct {
BasicType
}
тип CharType
CharType представляет знаковый символьный тип.
type CharType struct {
BasicType
}
тип Class 1.5
Class — это класс атрибута DWARF 4, к которому относится значение атрибута.
Как правило, значение заданного атрибута может относиться к одному из нескольких возможных классов, определённых DWARF, каждый из которых подразумевает несколько иную интерпретацию атрибута.
В DWARF версии 4 классы значений атрибутов различаются более детально, чем в предыдущих версиях DWARF. Читатель преобразует более общие классы из ранних версий DWARF в соответствующий класс DWARF 4. Например, в DWARF 2 класс «constant» используется для констант, а также для всех типов смещений в секциях, однако читатель приводит атрибуты в файлах DWARF 2, ссылающиеся на смещения в секциях, к одному из классов Class*Ptr, хотя эти классы были определены только в DWARF 3.
type Class int
const (
// ClassUnknown represents values of unknown DWARF class.
ClassUnknown Class = iota
// ClassAddress represents values of type uint64 that are
// addresses on the target machine.
ClassAddress
// ClassBlock represents values of type []byte whose
// interpretation depends on the attribute.
ClassBlock
// ClassConstant represents values of type int64 that are
// constants. The interpretation of this constant depends on
// the attribute.
ClassConstant
// ClassExprLoc represents values of type []byte that contain
// an encoded DWARF expression or location description.
ClassExprLoc
// ClassFlag represents values of type bool.
ClassFlag
// ClassLinePtr represents values that are an int64 offset
// into the "line" section.
ClassLinePtr
// ClassLocListPtr represents values that are an int64 offset
// into the "loclist" section.
ClassLocListPtr
// ClassMacPtr represents values that are an int64 offset into
// the "mac" section.
ClassMacPtr
// ClassRangeListPtr represents values that are an int64 offset into
// the "rangelist" section.
ClassRangeListPtr
// ClassReference represents values that are an Offset offset
// of an Entry in the info section (for use with Reader.Seek).
// The DWARF specification combines ClassReference and
// ClassReferenceSig into class "reference".
ClassReference
// ClassReferenceSig represents values that are a uint64 type
// signature referencing a type Entry.
ClassReferenceSig
// ClassString represents values that are strings. If the
// compilation unit specifies the AttrUseUTF8 flag (strongly
// recommended), the string value will be encoded in UTF-8.
// Otherwise, the encoding is unspecified.
ClassString
// ClassReferenceAlt represents values of type int64 that are
// an offset into the DWARF "info" section of an alternate
// object file.
ClassReferenceAlt
// ClassStringAlt represents values of type int64 that are an
// offset into the DWARF string section of an alternate object
// file.
ClassStringAlt
// ClassAddrPtr represents values that are an int64 offset
// into the "addr" section.
ClassAddrPtr
// ClassLocList represents values that are an int64 offset
// into the "loclists" section.
ClassLocList
// ClassRngList represents values that are a uint64 offset
// from the base of the "rnglists" section.
ClassRngList
// ClassRngListsPtr represents values that are an int64 offset
// into the "rnglists" section. These are used as the base for
// ClassRngList values.
ClassRngListsPtr
// ClassStrOffsetsPtr represents values that are an int64
// offset into the "str_offsets" section.
ClassStrOffsetsPtr
) func (Class) GoString 1.5
func (i Class) GoString() string
func (Class) String 1.5
func (i Class) String() string
тип CommonType
CommonType содержит поля, общие для нескольких типов. Если значение поля неизвестно или неприменимо для заданного типа, используется нулевое значение.
type CommonType struct {
ByteSize int64 // size of value of this type, in bytes
Name string // name that can be used to refer to type
}
func (*CommonType) Common
func (c *CommonType) Common() *CommonType
func (*CommonType) Size
func (c *CommonType) Size() int64
тип ComplexType
ComplexType представляет комплексный тип с плавающей точкой.
type ComplexType struct {
BasicType
}
тип Data
Data представляет отладочную информацию DWARF, загруженную из исполняемого файла (например, исполняемого файла ELF или Mach-O).
type Data struct {
// contains filtered or unexported fields
}
func New
func New(abbrev, aranges, frame, info, line, pubnames, ranges, str []byte) (*Data, error)
New возвращает новый объект Data, инициализированный переданными параметрами. Вместо непосредственного вызова этой функции обычно следует использовать метод DWARF типа File соответствующего пакета debug/elf, debug/macho или debug/pe.
Аргументы типа []byte содержат данные из соответствующей секции отладки объектного файла; например, для объекта ELF аргумент abbrev содержит данные секции «.debug_abbrev».
func (*Data) AddSection 1.14
func (d *Data) AddSection(name string, contents []byte) error
AddSection добавляет ещё одну секцию DWARF по имени. Имя должно соответствовать имени секции DWARF, например «.debug_addr», «.debug_str_offsets» и т. д. Этот способ используется для добавления новых секций DWARF, появившихся в DWARF 5 и более поздних версиях.
func (*Data) AddTypes 1.3
func (d *Data) AddTypes(name string, types []byte) error
AddTypes добавляет одну секцию .debug_types к данным DWARF. Типичный объект с отладочной информацией DWARF версии 4 содержит несколько секций .debug_types. Имя используется только для формирования сообщений об ошибках и позволяет отличать одну секцию .debug_types от другой.
func (*Data) LineReader 1.5
func (d *Data) LineReader(cu *Entry) (*LineReader, error)
LineReader возвращает новый считыватель таблицы строк единицы компиляции cu, которая должна быть Entry с тегом TagCompileUnit.
Если у этой единицы компиляции нет таблицы строк, возвращаются nil, nil.
func (*Data) Ranges 1.7
func (d *Data) Ranges(e *Entry) ([][2]uint64, error)
Ranges возвращает диапазоны PC, покрываемые e, в виде среза пар [low,high). Диапазоны PC имеются только у некоторых типов записей, например TagCompileUnit или TagSubprogram; для остальных типов функция возвращает nil без ошибки.
func (*Data) Reader
func (d *Data) Reader() *Reader
Reader возвращает новый Reader для Data. Считыватель находится на байтовом смещении 0 в секции DWARF «info».
func (*Data) Type
func (d *Data) Type(off Offset) (Type, error)
Type считывает тип по смещению off в секции DWARF «info».
тип DecodeError
type DecodeError struct {
Name string
Offset Offset
Err string
}
func (DecodeError) Error
func (e DecodeError) Error() string
тип DotDotDotType
DotDotDotType представляет вариативный параметр функции ...
type DotDotDotType struct {
CommonType
}
func (*DotDotDotType) String
func (t *DotDotDotType) String() string
тип Entry
Entry представляет последовательность пар атрибут/значение.
type Entry struct {
Offset Offset // offset of Entry in DWARF info
Tag Tag // tag (kind of Entry)
Children bool // whether Entry is followed by children
Field []Field
}
func (*Entry) AttrField 1.5
func (e *Entry) AttrField(a Attr) *Field
AttrField возвращает Field, связанное с атрибутом Attr в Entry, или nil, если такого атрибута нет.
func (*Entry) Val
func (e *Entry) Val(a Attr) any
Val возвращает значение, связанное с атрибутом Attr в Entry, или nil, если такого атрибута нет.
Часто проверку на возврат nil объединяют с проверкой того, что значение имеет ожидаемый динамический тип, например:
v, ok := e.Val(AttrSibling).(int64)
тип EnumType
EnumType представляет перечисляемый тип. Единственным указанием на его собственный целочисленный тип является его ByteSize (внутри CommonType).
type EnumType struct {
CommonType
EnumName string
Val []*EnumValue
}
func (*EnumType) String
func (t *EnumType) String() string
тип EnumValue
EnumValue представляет одно значение перечисления.
type EnumValue struct {
Name string
Val int64
}
тип Field
Field представляет отдельную пару атрибут/значение в Entry.
Значение может относиться к одному из нескольких «классов атрибутов», определённых DWARF. Типы Go, соответствующие каждому классу:
DWARF class Go type Class ----------- ------- ----- 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 Field struct {
Attr Attr
Val any
Class Class // Go 1.5
}
тип FloatType
FloatType представляет тип с плавающей точкой.
type FloatType struct {
BasicType
}
тип FuncType
FuncType представляет тип функции.
type FuncType struct {
CommonType
ReturnType Type
ParamType []Type
}
func (*FuncType) String
func (t *FuncType) String() string
тип IntType
IntType представляет знаковый целочисленный тип.
type IntType struct {
BasicType
}
тип LineEntry 1.5
LineEntry — это строка таблицы строк DWARF.
type LineEntry struct {
// Address is the program-counter value of a machine
// instruction generated by the compiler. This LineEntry
// applies to each instruction from Address to just before the
// Address of the next LineEntry.
Address uint64
// OpIndex is the index of an operation within a VLIW
// instruction. The index of the first operation is 0. For
// non-VLIW architectures, it will always be 0. Address and
// OpIndex together form an operation pointer that can
// reference any individual operation within the instruction
// stream.
OpIndex int
// File is the source file corresponding to these
// instructions.
File *LineFile
// Line is the source code line number corresponding to these
// instructions. Lines are numbered beginning at 1. It may be
// 0 if these instructions cannot be attributed to any source
// line.
Line int
// Column is the column number within the source line of these
// instructions. Columns are numbered beginning at 1. It may
// be 0 to indicate the "left edge" of the line.
Column int
// IsStmt indicates that Address is a recommended breakpoint
// location, such as the beginning of a line, statement, or a
// distinct subpart of a statement.
IsStmt bool
// BasicBlock indicates that Address is the beginning of a
// basic block.
BasicBlock bool
// PrologueEnd indicates that Address is one (of possibly
// many) PCs where execution should be suspended for a
// breakpoint on entry to the containing function.
//
// Added in DWARF 3.
PrologueEnd bool
// EpilogueBegin indicates that Address is one (of possibly
// many) PCs where execution should be suspended for a
// breakpoint on exit from this function.
//
// Added in DWARF 3.
EpilogueBegin bool
// ISA is the instruction set architecture for these
// instructions. Possible ISA values should be defined by the
// applicable ABI specification.
//
// Added in DWARF 3.
ISA int
// Discriminator is an arbitrary integer indicating the block
// to which these instructions belong. It serves to
// distinguish among multiple blocks that may all have with
// the same source file, line, and column. Where only one
// block exists for a given source position, it should be 0.
//
// Added in DWARF 3.
Discriminator int
// EndSequence indicates that Address is the first byte after
// the end of a sequence of target machine instructions. If it
// is set, only this and the Address field are meaningful. A
// line number table may contain information for multiple
// potentially disjoint instruction sequences. The last entry
// in a line table should always have EndSequence set.
EndSequence bool
}
тип LineFile 1.5
LineFile — это исходный файл, на который ссылается запись таблицы строк DWARF.
type LineFile struct {
Name string
Mtime uint64 // Implementation defined modification time, or 0 if unknown
Length int // File length, or 0 if unknown
}
тип LineReader 1.5
LineReader считывает последовательность структур LineEntry из секции DWARF «line» для одной единицы компиляции. Записи LineEntry упорядочены по возрастанию PC, и каждая LineEntry содержит метаданные для инструкций от PC этой записи LineEntry до PC следующей LineEntry (не включая его). Для последней записи будет установлено поле LineEntry.EndSequence.
type LineReader struct {
// contains filtered or unexported fields
}
func (*LineReader) Files 1.14
func (r *LineReader) Files() []*LineFile
Files возвращает таблицу имён файлов этой единицы компиляции в текущей позиции таблицы строк. На таблицу имён файлов могут ссылаться атрибуты этой единицы компиляции, например AttrDeclFile.
Запись 0 всегда равна nil, поскольку индекс файла 0 означает «нет файла».
Таблица имён файлов единицы компиляции не является неизменной. Files возвращает таблицу файлов в текущей позиции таблицы строк. В ней может быть больше записей, чем в таблице файлов в более ранней позиции таблицы строк, однако существующие записи никогда не меняются.
func (*LineReader) Next 1.5
func (r *LineReader) Next(entry *LineEntry) error
Next присваивает *entry следующую строку этой таблицы строк и перемещается к следующей строке. Если записей больше нет и таблица строк завершена корректно, функция возвращает io.EOF.
Строки всегда упорядочены по возрастанию entry.Address, но entry.Line может увеличиваться или уменьшаться.
func (*LineReader) Reset 1.5
func (r *LineReader) Reset()
Reset перемещает считыватель таблицы строк в её начало.
func (*LineReader) Seek 1.5
func (r *LineReader) Seek(pos LineReaderPos)
Seek восстанавливает позицию считывателя таблицы строк, полученную с помощью LineReader.Tell.
Аргумент pos должен быть получен в результате вызова LineReader.Tell для этой таблицы строк.
func (*LineReader) SeekPC 1.5
func (r *LineReader) SeekPC(pc uint64, entry *LineEntry) error
SeekPC присваивает *entry значение LineEntry, включающее pc, и устанавливает считыватель на следующую запись таблицы строк. При необходимости функция выполняет поиск pc в обратном направлении.
Если pc не покрывается ни одной записью этой таблицы строк, SeekPC возвращает ErrUnknownPC. В этом случае значения *entry и конечная позиция поиска не определены.
Обратите внимание, что таблицы строк DWARF допускают только последовательное сканирование вперёд. Поэтому в худшем случае время выполнения линейно зависит от размера таблицы строк. Если вызывающему коду требуется многократно и быстро искать PC, следует построить подходящий индекс таблицы строк.
func (*LineReader) Tell 1.5
func (r *LineReader) Tell() LineReaderPos
Tell возвращает текущую позицию в таблице строк.
тип LineReaderPos 1.5
LineReaderPos представляет позицию в таблице строк.
type LineReaderPos struct {
// contains filtered or unexported fields
}
тип Offset
Offset представляет расположение Entry в данных DWARF. (См. Reader.Seek.)
type Offset uint32
тип PtrType
PtrType представляет тип указателя.
type PtrType struct {
CommonType
Type Type
}
func (*PtrType) String
func (t *PtrType) String() string
тип QualType
QualType представляет тип с квалификатором C/C++ «const», «restrict» или «volatile».
type QualType struct {
CommonType
Qual string
Type Type
}
func (*QualType) Size
func (t *QualType) Size() int64
func (*QualType) String
func (t *QualType) String() string
тип Reader
Reader позволяет считывать структуры Entry из секции DWARF «info». Структуры Entry организованы в виде дерева. Функция Reader.Next возвращает последовательные записи при прямом обходе дерева. Если у записи есть дочерние элементы, её поле Children будет равно true; далее следуют дочерние записи, завершающиеся Entry с Tag 0.
type Reader struct {
// contains filtered or unexported fields
}
func (*Reader) AddressSize 1.5
func (r *Reader) AddressSize() int
AddressSize возвращает размер адресов в байтах в текущей единице компиляции.
func (*Reader) ByteOrder 1.14
func (r *Reader) ByteOrder() binary.ByteOrder
ByteOrder возвращает порядок байтов в текущей единице компиляции.
func (*Reader) Next
func (r *Reader) Next() (*Entry, error)
Next считывает следующую запись из закодированного потока записей. При достижении конца секции функция возвращает nil, nil. Если текущее смещение недопустимо или данные по этому смещению невозможно декодировать как корректную Entry, возвращается ошибка.
func (*Reader) Seek
func (r *Reader) Seek(off Offset)
Seek устанавливает Reader на смещение off в закодированном потоке записей. Для обозначения первой записи можно использовать смещение 0.
func (*Reader) SeekPC 1.7
func (r *Reader) SeekPC(pc uint64) (*Entry, error)
SeekPC возвращает Entry единицы компиляции, включающей pc, и устанавливает считыватель на чтение дочерних элементов этой единицы. Если pc не покрывается ни одной единицей, SeekPC возвращает ErrUnknownPC, а позиция считывателя остаётся неопределённой.
Поскольку единицы компиляции могут описывать несколько областей исполняемого файла, в худшем случае SeekPC должен просмотреть все диапазоны во всех единицах компиляции. При каждом вызове SeekPC поиск начинается с единицы компиляции, найденной при предыдущем вызове, поэтому, как правило, последовательность поисков PC выполняется быстрее, если значения отсортированы. Если вызывающему коду требуется многократно и быстро искать PC, следует построить подходящий индекс с помощью метода Ranges.
func (*Reader) SkipChildren
func (r *Reader) SkipChildren()
SkipChildren пропускает дочерние записи, связанные с последней Entry, возвращённой вызовом Reader.Next. Если у этой Entry нет дочерних элементов или Reader.Next ещё не вызывался, SkipChildren ничего не делает.
тип StructField
StructField представляет поле структуры, объединения или типа класса C++.
Битовые поля
Поля BitSize, BitOffset и DataBitOffset описывают размер в битах и смещение членов данных, объявленных как битовые поля в типах struct/union/class языка C/C++.
BitSize — количество битов в битовом поле.
Если DataBitOffset не равен нулю, он задаёт количество битов от начала содержащей сущности (например, содержащей структуры/class/union) до начала битового поля. Это соответствует атрибуту DWARF DW_AT_data_bit_offset, введённому в DWARF 4.
Если BitOffset не равен нулю, он задаёт количество битов между старшим битом единицы хранения, содержащей битовое поле, и старшим битом самого битового поля. Здесь «единица хранения» — это имя типа, указанное перед битовым полем (для поля «unsigned x:17» единицей хранения является «unsigned»). Значения BitOffset могут различаться в зависимости от порядка байтов в системе. BitOffset соответствует атрибуту DWARF DW_AT_bit_offset, устаревшему в DWARF 4 и удалённому в DWARF 5.
Не более одного из DataBitOffset и BitOffset может быть ненулевым; DataBitOffset/BitOffset будет ненулевым, только если BitSize ненулевой. Выбор компилятором C одного из этих вариантов зависит от его версии и параметров командной строки.
Ниже приведён пример использования битовых полей в C/C++ и описание ожидаемых сведений о смещении битов DWARF. Рассмотрим следующий код:
struct S {
int q;
int j:5;
int k:6;
int m:5;
int n:8;
} s;
Для приведённого выше кода ожидаются следующие значения DW_AT_bit_offset (при использовании GCC 8):
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
Значение 32 для «j» отражает тот факт, что перед битовым полем расположены другие члены данных (напомним, что значения DW_AT_data_bit_offset отсчитываются от начала содержащей структуры). Поэтому значения DW_AT_data_bit_offset могут быть довольно большими для структур с множеством полей.
DWARF также допускает базовые типы с ненулевыми размером в битах и смещением битов; эта информация сохраняется и для базовых типов. Однако стоит отметить, что добиться такого поведения с помощью распространённых языков программирования невозможно.
type StructField struct {
Name string
Type Type
ByteOffset int64
ByteSize int64 // usually zero; use Type.Size() for normal fields
BitOffset int64
DataBitOffset int64 // Go 1.18
BitSize int64 // zero if not a bit field
}
тип StructType
StructType представляет тип структуры, объединения или класса C++.
type StructType struct {
CommonType
StructName string
Kind string // "struct", "union", or "class".
Field []*StructField
Incomplete bool // if true, struct, union, class is declared but not defined
}
func (*StructType) Defn
func (t *StructType) Defn() string
func (*StructType) String
func (t *StructType) String() string
тип Tag
Tag — это классификация (тип) Entry.
type Tag uint32
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
// The following are new in 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 // Later removed from DWARF.
TagCondition Tag = 0x3F
TagSharedType Tag = 0x40
// The following are new in DWARF 4.
TagTypeUnit Tag = 0x41
TagRvalueReferenceType Tag = 0x42
TagTemplateAlias Tag = 0x43
// The following are new in 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
) func (Tag) GoString
func (t Tag) GoString() string
func (Tag) String
func (i Tag) String() string
тип Type
Обычно Type представляет собой указатель на одну из конкретных структур Type (CharType, StructType и т. д.).
type Type interface {
Common() *CommonType
String() string
Size() int64
} тип TypedefType
TypedefType представляет именованный тип.
type TypedefType struct {
CommonType
Type Type
}
func (*TypedefType) Size
func (t *TypedefType) Size() int64
func (*TypedefType) String
func (t *TypedefType) String() string
тип UcharType
UcharType представляет беззнаковый символьный тип.
type UcharType struct {
BasicType
}
тип UintType
UintType представляет беззнаковый целочисленный тип.
type UintType struct {
BasicType
}
тип UnspecifiedType 1.4
UnspecifiedType представляет неявный, неизвестный, неоднозначный или несуществующий тип.
type UnspecifiedType struct {
BasicType
}
тип UnsupportedType 1.13
UnsupportedType — это заполнитель, возвращаемый в случаях, когда встречается неподдерживаемый тип.
type UnsupportedType struct {
CommonType
Tag Tag
}
func (*UnsupportedType) String 1.13
func (t *UnsupportedType) String() string
тип VoidType
VoidType представляет тип void языка C.
type VoidType struct {
CommonType
}
func (*VoidType) String
func (t *VoidType) String() string
© Google, Inc.
Licensed under the Creative Commons Attribution License 3.0.
http://golang.org/pkg/debug/dwarf/