const (
SymVerABI0 = 0
SymVerABIInternal = 1
SymVerABICount = 2 // Number of internal ABIs
SymVerStatic = 10 // Minimum version used by static (file-local) syms
)
AbiSymKindToSymKind maps values read from object files (which are of type cmd/internal/objabi.SymKind) to values of type SymKind.
var AbiSymKindToSymKind = [...]SymKind{ objabi.Sxxx: Sxxx, objabi.STEXT: STEXT, objabi.STEXTFIPS: STEXTFIPS, objabi.SRODATA: SRODATA, objabi.SRODATAFIPS: SRODATAFIPS, objabi.SNOPTRDATA: SNOPTRDATA, objabi.SNOPTRDATAFIPS: SNOPTRDATAFIPS, objabi.SDATA: SDATA, objabi.SDATAFIPS: SDATAFIPS, objabi.SBSS: SBSS, objabi.SNOPTRBSS: SNOPTRBSS, objabi.STLSBSS: STLSBSS, objabi.SDWARFCUINFO: SDWARFCUINFO, objabi.SDWARFCONST: SDWARFCONST, objabi.SDWARFFCN: SDWARFFCN, objabi.SDWARFABSFCN: SDWARFABSFCN, objabi.SDWARFTYPE: SDWARFTYPE, objabi.SDWARFVAR: SDWARFVAR, objabi.SDWARFRANGE: SDWARFRANGE, objabi.SDWARFLOC: SDWARFLOC, objabi.SDWARFLINES: SDWARFLINES, objabi.SDWARFADDR: SDWARFADDR, objabi.SLIBFUZZER_8BIT_COUNTER: SLIBFUZZER_8BIT_COUNTER, objabi.SCOVERAGE_COUNTER: SCOVERAGE_COUNTER, objabi.SCOVERAGE_AUXVAR: SCOVERAGE_AUXVAR, objabi.SSEHUNWINDINFO: SSEHUNWINDINFO, }
ReadOnly are the symbol kinds that form read-only sections. In some cases, if they will require relocations, they are transformed into rel-ro sections using relROMap.
var ReadOnly = []SymKind{ STYPE, SSTRING, SGOSTRING, SGOFUNC, SGCBITS, SRODATA, SRODATAFIPSSTART, SRODATAFIPS, SRODATAFIPSEND, SRODATAEND, SFUNCTAB, }
RelROMap describes the transformation of read-only symbols to rel-ro symbols.
var RelROMap = map[SymKind]SymKind{ STYPE: STYPERELRO, SSTRING: SSTRINGRELRO, SGOSTRING: SGOSTRINGRELRO, SGOFUNC: SGOFUNCRELRO, SGCBITS: SGCBITSRELRO, SRODATA: SRODATARELRO, SFUNCTAB: SFUNCTABRELRO, }
func ABIToVersion(abi obj.ABI) int
func RelocName(arch *sys.Arch, r objabi.RelocType) string
func VersionToABI(v int) (obj.ABI, bool)
A CompilationUnit represents a set of source files that are compiled together. Since all Go sources in a Go package are compiled together, there's one CompilationUnit per package that represents all Go sources in that package, plus one for each assembly file.
Equivalently, there's one CompilationUnit per object file in each Library loaded by the linker.
These are used for both DWARF and pclntab generation.
type CompilationUnit struct {
Lib *Library // Our library
PclnIndex int // Index of this CU in pclntab
PCs []dwarf.Range // PC ranges, relative to Textp[0]
DWInfo *dwarf.DWDie // CU root DIE
FileTable []string // The file table used in this compilation unit.
Consts LoaderSym // Package constants DIEs
FuncDIEs []LoaderSym // Function DIE subtrees
VarDIEs []LoaderSym // Global variable DIEs
AbsFnDIEs []LoaderSym // Abstract function DIE subtrees
RangeSyms []LoaderSym // Symbols for debug_range
Textp []LoaderSym // Text symbols in this CU
Addrs map[LoaderSym]uint32 // slot in .debug_addr for fn sym (DWARF5)
}
type Library struct {
Objref string
Srcref string
File string
Pkg string
Shlib string
Fingerprint goobj.FingerprintType
Autolib []goobj.ImportedPkg
Imports []*Library
Main bool
Units []*CompilationUnit
Textp []LoaderSym // text syms defined in this library
DupTextSyms []LoaderSym // dupok text syms defined in this library
}
func (l Library) String() string
LoaderSym holds a loader.Sym value. We can't refer to this type from the sym package since loader imports sym.
type LoaderSym uint32
RelocVariant is a linker-internal variation on a relocation.
type RelocVariant uint8
const (
RV_NONE RelocVariant = iota
RV_POWER_LO
RV_POWER_HI
RV_POWER_HA
RV_POWER_DS
// RV_390_DBL is a s390x-specific relocation variant that indicates that
// the value to be placed into the relocatable field should first be
// divided by 2.
RV_390_DBL
RV_CHECK_OVERFLOW RelocVariant = 1 << 7
RV_TYPE_MASK RelocVariant = RV_CHECK_OVERFLOW - 1
)
type Section struct {
Rwx uint8
Extnum int16
Align int32
Name string
Vaddr uint64
Length uint64
Seg *Segment
Elfsect interface{} // an *ld.ElfShdr
Reloff uint64
Rellen uint64
// Relcount is the number of *host* relocations applied to this section
// (when external linking).
// Incremented atomically on multiple goroutines.
// Note: this may differ from number of Go relocations, as one Go relocation
// may turn into multiple host relocations.
Relcount uint32
Sym LoaderSym // symbol for the section, if any
Index uint16 // each section has a unique index, used internally
Compressed bool
}
type Segment struct {
Rwx uint8 // permission as usual unix bits (5 = r-x etc)
Vaddr uint64 // virtual address
Length uint64 // length in memory
Fileoff uint64 // file offset
Filelen uint64 // length on disk
Sections []*Section
}
A SymKind describes the kind of memory represented by a symbol.
type SymKind uint8
Defined SymKind values.
TODO(rsc): Give idiomatic Go names.
const (
Sxxx SymKind = iota
STEXT
STEXTFIPSSTART
STEXTFIPS
STEXTFIPSEND
STEXTEND
SELFRXSECT
SMACHOPLT
// Read-only sections.
STYPE
SSTRING
SGOSTRING
SGOFUNC
SGCBITS
SRODATA
SRODATAFIPSSTART
SRODATAFIPS
SRODATAFIPSEND
SRODATAEND
SFUNCTAB
SELFROSECT
// Read-only sections with relocations.
//
// Types STYPE-SFUNCTAB above are written to the .rodata section by default.
// When linking a shared object, some conceptually "read only" types need to
// be written to by relocations and putting them in a section called
// ".rodata" interacts poorly with the system linkers. The GNU linkers
// support this situation by arranging for sections of the name
// ".data.rel.ro.XXX" to be mprotected read only by the dynamic linker after
// relocations have applied, so when the Go linker is creating a shared
// object it checks all objects of the above types and bumps any object that
// has a relocation to it to the corresponding type below, which are then
// written to sections with appropriate magic names.
STYPERELRO
SSTRINGRELRO
SGOSTRINGRELRO
SGOFUNCRELRO
SGCBITSRELRO
SRODATARELRO
SFUNCTABRELRO
SELFRELROSECT
SMACHORELROSECT
// Part of .data.rel.ro if it exists, otherwise part of .rodata.
STYPELINK
SITABLINK
SSYMTAB
SPCLNTAB
// Writable sections.
SFirstWritable
SBUILDINFO
SFIPSINFO
SELFSECT
SMACHO
SMACHOGOT
SWINDOWS
SELFGOT
SNOPTRDATA
SNOPTRDATAFIPSSTART
SNOPTRDATAFIPS
SNOPTRDATAFIPSEND
SNOPTRDATAEND
SINITARR
SDATA
SDATAFIPSSTART
SDATAFIPS
SDATAFIPSEND
SDATAEND
SXCOFFTOC
SBSS
SNOPTRBSS
SLIBFUZZER_8BIT_COUNTER
SCOVERAGE_COUNTER
SCOVERAGE_AUXVAR
STLSBSS
SXREF
SMACHOSYMSTR
SMACHOSYMTAB
SMACHOINDIRECTPLT
SMACHOINDIRECTGOT
SFILEPATH
SDYNIMPORT
SHOSTOBJ
SUNDEFEXT // Undefined symbol for resolution by external linker
// Sections for debugging information
SDWARFSECT
// DWARF symbol types
SDWARFCUINFO
SDWARFCONST
SDWARFFCN
SDWARFABSFCN
SDWARFTYPE
SDWARFVAR
SDWARFRANGE
SDWARFLOC
SDWARFLINES
SDWARFADDR
// SEH symbol types
SSEHUNWINDINFO
SSEHSECT
)
func (t SymKind) IsDATA() bool
IsDATA returns true if t is one of the SDATA types.
func (t SymKind) IsDWARF() bool
func (t SymKind) IsData() bool
IsData returns true if t is any kind of data type.
func (t SymKind) IsNOPTRDATA() bool
IsNOPTRDATA returns true if t is one of the SNOPTRDATA types.
func (t SymKind) IsRODATA() bool
IsRODATA returns true if t is one of the SRODATA types.
func (t SymKind) IsText() bool
IsText returns true if t is a text type.
func (i SymKind) String() string