Go: cmd/link/internal/sym Index | Files

package sym

import "cmd/link/internal/sym"

Index

Package Files

attribute.go compilation_unit.go library.go reloc.go segment.go symbol.go symbols.go symkind.go symkind_string.go

Constants

const (
    SymVerABI0        = 0
    SymVerABIInternal = 1
    SymVerStatic      = 10 // Minimum version used by static (file-local) syms
)

Variables

var AbiSymKindToSymKind = [...]SymKind{
    Sxxx,
    STEXT,
    SRODATA,
    SNOPTRDATA,
    SDATA,
    SBSS,
    SNOPTRBSS,
    STLSBSS,
    SDWARFINFO,
    SDWARFRANGE,
    SDWARFLOC,
    SDWARFLINES,
    SABIALIAS,
    SLIBFUZZER_EXTRA_COUNTER,
}

AbiSymKindToSymKind maps values read from object files (which are of type cmd/internal/objabi.SymKind) to values of type SymKind.

var ReadOnly = []SymKind{
    STYPE,
    SSTRING,
    SGOSTRING,
    SGOFUNC,
    SGCBITS,
    SRODATA,
    SFUNCTAB,
}

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 RelROMap = map[SymKind]SymKind{
    STYPE:     STYPERELRO,
    SSTRING:   SSTRINGRELRO,
    SGOSTRING: SGOSTRINGRELRO,
    SGOFUNC:   SGOFUNCRELRO,
    SGCBITS:   SGCBITSRELRO,
    SRODATA:   SRODATARELRO,
    SFUNCTAB:  SFUNCTABRELRO,
}

RelROMap describes the transformation of read-only symbols to rel-ro symbols.

func ABIToVersion Uses

func ABIToVersion(abi obj.ABI) int

func RelocName Uses

func RelocName(arch *sys.Arch, r objabi.RelocType) string

func VersionToABI Uses

func VersionToABI(v int) (obj.ABI, bool)

type Attribute Uses

type Attribute int32

Attribute is a set of common symbol attributes.

const (
    // AttrDuplicateOK marks a symbol that can be present in multiple object
    // files.
    AttrDuplicateOK Attribute = 1 << iota
    // AttrExternal marks function symbols loaded from host object files.
    AttrExternal
    // AttrNoSplit marks functions that cannot split the stack; the linker
    // cares because it checks that there are no call chains of nosplit
    // functions that require more than StackLimit bytes (see
    // lib.go:dostkcheck)
    AttrNoSplit
    // AttrReachable marks symbols that are transitively referenced from the
    // entry points. Unreachable symbols are not written to the output.
    AttrReachable
    // AttrCgoExportDynamic and AttrCgoExportStatic mark symbols referenced
    // by directives written by cgo (in response to //export directives in
    // the source).
    AttrCgoExportDynamic
    AttrCgoExportStatic
    // AttrSpecial marks symbols that do not have their address (i.e. Value)
    // computed by the usual mechanism of data.go:dodata() &
    // data.go:address().
    AttrSpecial
    // AttrStackCheck is used by dostkcheck to only check each NoSplit
    // function's stack usage once.
    AttrStackCheck
    // AttrNotInSymbolTable marks symbols that are not written to the symbol table.
    AttrNotInSymbolTable
    // AttrOnList marks symbols that are on some list (such as the list of
    // all text symbols, or one of the lists of data symbols) and is
    // consulted to avoid bugs where a symbol is put on a list twice.
    AttrOnList
    // AttrLocal marks symbols that are only visible within the module
    // (executable or shared library) being linked. Only relevant when
    // dynamically linking Go code.
    AttrLocal
    // AttrReflectMethod marks certain methods from the reflect package that
    // can be used to call arbitrary methods. If no symbol with this bit set
    // is marked as reachable, more dead code elimination can be done.
    AttrReflectMethod
    // AttrMakeTypelink Amarks types that should be added to the typelink
    // table. See typelinks.go:typelinks().
    AttrMakeTypelink
    // AttrShared marks symbols compiled with the -shared option.
    AttrShared
    // AttrVisibilityHidden symbols are ELF symbols with
    // visibility set to STV_HIDDEN. They become local symbols in
    // the final executable. Only relevant when internally linking
    // on an ELF platform.
    AttrVisibilityHidden
    // AttrSubSymbol mostly means that the symbol appears on the Sub list of some
    // other symbol.  Unfortunately, it's not 100% reliable; at least, it's not set
    // correctly for the .TOC. symbol in Link.dodata.  Usually the Outer field of the
    // symbol points to the symbol whose list it is on, but that it is not set for the
    // symbols added to .windynamic in initdynimport in pe.go.
    //
    // TODO(mwhudson): fix the inconsistencies noticed above.
    //
    // Sub lists are used when loading host objects (sections from the host object
    // become regular linker symbols and symbols go on the Sub list of their section)
    // and for constructing the global offset table when internally linking a dynamic
    // executable.
    //
    // TODO(mwhudson): perhaps a better name for this is AttrNonGoSymbol.
    AttrSubSymbol
    // AttrContainer is set on text symbols that are present as the .Outer for some
    // other symbol.
    AttrContainer
    // AttrTopFrame means that the function is an entry point and unwinders
    // should stop when they hit this function.
    AttrTopFrame
    // AttrReadOnly indicates whether the symbol's content (Symbol.P) is backed by
    // read-only memory.
    AttrReadOnly
)

func (*Attribute) CgoExport Uses

func (a *Attribute) CgoExport() bool

func (*Attribute) CgoExportDynamic Uses

func (a *Attribute) CgoExportDynamic() bool

func (*Attribute) CgoExportStatic Uses

func (a *Attribute) CgoExportStatic() bool

func (*Attribute) Container Uses

func (a *Attribute) Container() bool

func (*Attribute) DuplicateOK Uses

func (a *Attribute) DuplicateOK() bool

func (*Attribute) External Uses

func (a *Attribute) External() bool

func (*Attribute) Local Uses

func (a *Attribute) Local() bool
func (a *Attribute) MakeTypelink() bool

func (*Attribute) NoSplit Uses

func (a *Attribute) NoSplit() bool

func (*Attribute) NotInSymbolTable Uses

func (a *Attribute) NotInSymbolTable() bool

func (*Attribute) OnList Uses

func (a *Attribute) OnList() bool

func (*Attribute) Reachable Uses

func (a *Attribute) Reachable() bool

func (*Attribute) ReadOnly Uses

func (a *Attribute) ReadOnly() bool

func (*Attribute) ReflectMethod Uses

func (a *Attribute) ReflectMethod() bool

func (*Attribute) Set Uses

func (a *Attribute) Set(flag Attribute, value bool)

func (*Attribute) Shared Uses

func (a *Attribute) Shared() bool

func (*Attribute) Special Uses

func (a *Attribute) Special() bool

func (*Attribute) StackCheck Uses

func (a *Attribute) StackCheck() bool

func (*Attribute) SubSymbol Uses

func (a *Attribute) SubSymbol() bool

func (*Attribute) TopFrame Uses

func (a *Attribute) TopFrame() bool

func (*Attribute) VisibilityHidden Uses

func (a *Attribute) VisibilityHidden() bool

type AuxSymbol Uses

type AuxSymbol struct {
    // contains filtered or unexported fields
}

AuxSymbol contains less-frequently used sym.Symbol fields.

type CompilationUnit Uses

type CompilationUnit struct {
    Pkg            string        // The package name, eg ("fmt", or "runtime")
    Lib            *Library      // Our library
    Consts         *Symbol       // Package constants DIEs
    PCs            []dwarf.Range // PC ranges, relative to Textp[0]
    DWInfo         *dwarf.DWDie  // CU root DIE
    FuncDIEs       []*Symbol     // Function DIE subtrees
    AbsFnDIEs      []*Symbol     // Abstract function DIE subtrees
    RangeSyms      []*Symbol     // Symbols for debug_range
    Textp          []*Symbol     // Text symbols in this CU
    DWARFFileTable []string      // The file table used to generate the .debug_lines

    Consts2    LoaderSym   // Package constants DIEs (loader)
    FuncDIEs2  []LoaderSym // Function DIE subtrees (loader)
    AbsFnDIEs2 []LoaderSym // Abstract function DIE subtrees (loader)
    RangeSyms2 []LoaderSym // Symbols for debug_range (loader)
    Textp2     []LoaderSym // Text symbols in this CU (loader)
}

CompilationUnit is an abstraction used by DWARF to represent a chunk of debug-related data. We create a CompilationUnit per Object file in a library (so, one for all the Go code, one for each assembly file, etc.).

type Library Uses

type Library struct {
    Objref      string
    Srcref      string
    File        string
    Pkg         string
    Shlib       string
    Hash        string
    Fingerprint goobj2.FingerprintType
    Autolib     []goobj2.ImportedPkg
    Imports     []*Library
    Main        bool
    Safe        bool
    Units       []*CompilationUnit

    Textp2       []LoaderSym // text syms defined in this library
    DupTextSyms2 []LoaderSym // dupok text syms defined in this library
}

func (Library) String Uses

func (l Library) String() string

type LoaderSym Uses

type LoaderSym int

LoaderSym holds a loader.Sym value. We can't refer to this type from the sym package since loader imports sym.

type Pcdata Uses

type Pcdata struct {
    P []byte
}

type Reloc Uses

type Reloc struct {
    Off       int32            // offset to rewrite
    Siz       uint8            // number of bytes to rewrite, 1, 2, or 4
    Done      bool             // set to true when relocation is complete
    Type      objabi.RelocType // the relocation type
    Add       int64            // addend
    Sym       *Symbol          // symbol the relocation addresses
    *RelocExt                  // extra fields (see below), may be nil, call InitExt before use
}

Reloc is a relocation.

The typical Reloc rewrites part of a symbol at offset Off to address Sym. A Reloc is stored in a slice on the Symbol it rewrites.

Relocations are generated by the compiler as the type cmd/internal/obj.Reloc, which is encoded into the object file wire format and decoded by the linker into this type. A separate type is used to hold linker-specific state about the relocation.

Some relocations are created by cmd/link.

func (*Reloc) InitExt Uses

func (r *Reloc) InitExt()

type RelocByOff Uses

type RelocByOff []Reloc

RelocByOff implements sort.Interface for sorting relocations by offset.

func (RelocByOff) Len Uses

func (x RelocByOff) Len() int

func (RelocByOff) Less Uses

func (x RelocByOff) Less(i, j int) bool

func (RelocByOff) Swap Uses

func (x RelocByOff) Swap(i, j int)

type RelocExt Uses

type RelocExt struct {
    Xadd    int64        // addend passed to external linker
    Xsym    *Symbol      // symbol passed to external linker
    Variant RelocVariant // variation on Type, currently used only on PPC64 and S390X
}

relocExt contains extra fields in Reloc that are used only in certain cases.

type RelocVariant Uses

type RelocVariant uint8

RelocVariant is a linker-internal variation on a relocation.

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 Uses

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
    Sym     *Symbol   // symbol for the section, if any
    Sym2    LoaderSym // symbol for the section, if any
    Index   uint16    // each section has a unique index, used internally
}

type Segment Uses

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
}

type SymKind Uses

type SymKind uint8

A SymKind describes the kind of memory represented by a symbol.

const (
    Sxxx SymKind = iota
    STEXT
    SELFRXSECT

    // Read-only sections.
    STYPE
    SSTRING
    SGOSTRING
    SGOFUNC
    SGCBITS
    SRODATA
    SFUNCTAB

    SELFROSECT
    SMACHOPLT

    // 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

    // Part of .data.rel.ro if it exists, otherwise part of .rodata.
    STYPELINK
    SITABLINK
    SSYMTAB
    SPCLNTAB

    // Writable sections.
    SFirstWritable
    SBUILDINFO
    SELFSECT
    SMACHO
    SMACHOGOT
    SWINDOWS
    SELFGOT
    SNOPTRDATA
    SINITARR
    SDATA
    SXCOFFTOC
    SBSS
    SNOPTRBSS
    SLIBFUZZER_EXTRA_COUNTER
    STLSBSS
    SXREF
    SMACHOSYMSTR
    SMACHOSYMTAB
    SMACHOINDIRECTPLT
    SMACHOINDIRECTGOT
    SFILEPATH
    SCONST
    SDYNIMPORT
    SHOSTOBJ
    SUNDEFEXT // Undefined symbol for resolution by external linker

    // Sections for debugging information
    SDWARFSECT
    SDWARFINFO
    SDWARFRANGE
    SDWARFLOC
    SDWARFLINES

    // ABI aliases (these never appear in the output)
    SABIALIAS
)

Defined SymKind values.

TODO(rsc): Give idiomatic Go names. go:generate stringer -type=SymKind

func (SymKind) IsData Uses

func (t SymKind) IsData() bool

IsData returns true if the type is a data type.

func (SymKind) String Uses

func (i SymKind) String() string

type Symbol Uses

type Symbol struct {
    Name    string
    Type    SymKind
    Version int16
    Attr    Attribute
    Dynid   int32
    Align   int32
    Value   int64
    Size    int64
    Outer   *Symbol
    SymIdx  LoaderSym

    Sect *Section
    // P contains the raw symbol data.
    P   []byte
    R   []Reloc
    // contains filtered or unexported fields
}

Symbol is an entry in the symbol table.

func (*Symbol) AddAddr Uses

func (s *Symbol) AddAddr(arch *sys.Arch, t *Symbol) int64

func (*Symbol) AddAddrPlus Uses

func (s *Symbol) AddAddrPlus(arch *sys.Arch, t *Symbol, add int64) int64

func (*Symbol) AddAddrPlus4 Uses

func (s *Symbol) AddAddrPlus4(t *Symbol, add int64) int64

func (*Symbol) AddBytes Uses

func (s *Symbol) AddBytes(bytes []byte) int64

func (*Symbol) AddCURelativeAddrPlus Uses

func (s *Symbol) AddCURelativeAddrPlus(arch *sys.Arch, t *Symbol, add int64) int64

func (*Symbol) AddPCRelPlus Uses

func (s *Symbol) AddPCRelPlus(arch *sys.Arch, t *Symbol, add int64) int64

func (*Symbol) AddRel Uses

func (s *Symbol) AddRel() *Reloc

func (*Symbol) AddSize Uses

func (s *Symbol) AddSize(arch *sys.Arch, t *Symbol) int64

func (*Symbol) AddUint Uses

func (s *Symbol) AddUint(arch *sys.Arch, v uint64) int64

func (*Symbol) AddUint16 Uses

func (s *Symbol) AddUint16(arch *sys.Arch, v uint16) int64

func (*Symbol) AddUint32 Uses

func (s *Symbol) AddUint32(arch *sys.Arch, v uint32) int64

func (*Symbol) AddUint64 Uses

func (s *Symbol) AddUint64(arch *sys.Arch, v uint64) int64

func (*Symbol) AddUint8 Uses

func (s *Symbol) AddUint8(v uint8) int64

func (*Symbol) AddUintXX Uses

func (s *Symbol) AddUintXX(arch *sys.Arch, v uint64, wid int) int64

func (*Symbol) Dynimplib Uses

func (s *Symbol) Dynimplib() string

func (*Symbol) Dynimpvers Uses

func (s *Symbol) Dynimpvers() string

func (*Symbol) ElfType Uses

func (s *Symbol) ElfType() elf.SymType

func (*Symbol) Extname Uses

func (s *Symbol) Extname() string

func (*Symbol) Got Uses

func (s *Symbol) Got() int32

func (*Symbol) Grow Uses

func (s *Symbol) Grow(siz int64)

func (*Symbol) IsFileLocal Uses

func (s *Symbol) IsFileLocal() bool

func (*Symbol) Len Uses

func (s *Symbol) Len() int64

func (*Symbol) Length Uses

func (s *Symbol) Length(dwarfContext interface{}) int64

func (*Symbol) Localentry Uses

func (s *Symbol) Localentry() uint8

func (*Symbol) Plt Uses

func (s *Symbol) Plt() int32

func (*Symbol) ResetDyninfo Uses

func (s *Symbol) ResetDyninfo()

func (*Symbol) SetAddr Uses

func (s *Symbol) SetAddr(arch *sys.Arch, off int64, t *Symbol) int64

func (*Symbol) SetAddrPlus Uses

func (s *Symbol) SetAddrPlus(arch *sys.Arch, off int64, t *Symbol, add int64) int64

func (*Symbol) SetDynimplib Uses

func (s *Symbol) SetDynimplib(lib string)

func (*Symbol) SetDynimpvers Uses

func (s *Symbol) SetDynimpvers(vers string)

func (*Symbol) SetElfType Uses

func (s *Symbol) SetElfType(val elf.SymType)

func (*Symbol) SetExtname Uses

func (s *Symbol) SetExtname(n string)

func (*Symbol) SetGot Uses

func (s *Symbol) SetGot(val int32)

func (*Symbol) SetLocalentry Uses

func (s *Symbol) SetLocalentry(val uint8)

func (*Symbol) SetPlt Uses

func (s *Symbol) SetPlt(val int32)

func (*Symbol) SetUint Uses

func (s *Symbol) SetUint(arch *sys.Arch, r int64, v uint64) int64

func (*Symbol) SetUint16 Uses

func (s *Symbol) SetUint16(arch *sys.Arch, r int64, v uint16) int64

func (*Symbol) SetUint32 Uses

func (s *Symbol) SetUint32(arch *sys.Arch, r int64, v uint32) int64

func (*Symbol) SetUint8 Uses

func (s *Symbol) SetUint8(arch *sys.Arch, r int64, v uint8) int64

func (*Symbol) String Uses

func (s *Symbol) String() string

type Symbols Uses

type Symbols struct {

    // Look up the symbol with the given name and version, creating the
    // symbol if it is not found.
    Lookup func(name string, v int) *Symbol

    // Look up the symbol with the given name and version, returning nil
    // if it is not found.
    ROLookup func(name string, v int) *Symbol
    // contains filtered or unexported fields
}

func NewSymbols Uses

func NewSymbols() *Symbols

func (*Symbols) IncVersion Uses

func (syms *Symbols) IncVersion() int

Allocate a new version (i.e. symbol namespace).

func (*Symbols) MaxVersion Uses

func (syms *Symbols) MaxVersion() int

returns the maximum version number

Package sym imports 10 packages (graph) and is imported by 30 packages. Updated 2020-10-16. Refresh now. Tools for package owners.

The go get command cannot install this package because of the following issues: