Documentation ¶
Index ¶
- Constants
- Variables
- func AbsFile(dir, file, rewrites string) string
- func AddVersionFlag()
- func ApplyRewrites(file, rewrites string) (string, bool)
- func DecodeArg(arg string) string
- func DefaultExpstring() string
- func Expstring() string
- func Flagcount(name, usage string, val *int)
- func Flagfn1(name, usage string, f func(string))
- func Flagparse(usage func())
- func Flagprint(w io.Writer)
- func Getgoextlinkenabled() string
- func IsRuntimePackagePath(pkgpath string) bool
- func PathToPrefix(s string) string
- func WorkingDir() string
- type FuncID
- type HeadType
- type RelocType
- type SymKind
Constants ¶
const ( A_AUTO = 1 + iota A_PARAM A_DELETED_AUTO )
Auto.name
const ( PCDATA_UnsafePoint = 0 PCDATA_StackMapIndex = 1 PCDATA_InlTreeIndex = 2 FUNCDATA_ArgsPointerMaps = 0 FUNCDATA_LocalsPointerMaps = 1 FUNCDATA_StackObjects = 2 FUNCDATA_InlTree = 3 FUNCDATA_OpenCodedDeferInfo = 4 // ArgsSizeUnknown is set in Func.argsize to mark all functions // whose argument size is unknown (C vararg functions, and // assembly code without an explicit specification). // This value is generated by the compiler, assembler, or linker. ArgsSizeUnknown = -0x80000000 )
const ( // PCDATA_UnsafePoint values. PCDATA_UnsafePointSafe = -1 // Safe for async preemption PCDATA_UnsafePointUnsafe = -2 // Unsafe for async preemption // PCDATA_Restart1(2) apply on a sequence of instructions, within // which if an async preemption happens, we should back off the PC // to the start of the sequence when resuming. // We need two so we can distinguish the start/end of the sequence // in case that two sequences are next to each other. PCDATA_Restart1 = -3 PCDATA_Restart2 = -4 // Like PCDATA_Restart1, but back to function entry if async preempted. PCDATA_RestartAtEntry = -5 )
Special PCDATA values.
const ( STACKSYSTEM = 0 StackSystem = STACKSYSTEM StackBig = 4096 StackSmall = 128 )
const ( KindBool = 1 + iota KindInt KindInt8 KindInt16 KindInt32 KindInt64 KindUint KindUint8 KindUint16 KindUint32 KindUint64 KindUintptr KindFloat32 KindFloat64 KindComplex64 KindComplex128 KindArray KindChan KindFunc KindInterface KindMap KindPtr KindSlice KindString KindStruct KindUnsafePointer KindDirectIface = 1 << 5 KindGCProg = 1 << 6 KindMask = (1 << 5) - 1 )
const ( ElfRelocOffset = 256 MachoRelocOffset = 2048 // reserve enough space for ELF relocations )
const (
StackPreempt = -1314 // 0xfff...fade
)
Variables ¶
var ( GOROOT = envOr("GOROOT", defaultGOROOT) GOARCH = envOr("GOARCH", defaultGOARCH) GOOS = envOr("GOOS", defaultGOOS) GO386 = envOr("GO386", defaultGO386) GOARM = goarm() GOMIPS = gomips() GOMIPS64 = gomips64() GOPPC64 = goppc64() GOWASM = gowasm() GO_LDSO = defaultGO_LDSO Version = version )
var ( Fieldtrack_enabled int Preemptibleloops_enabled int Staticlockranking_enabled int Regabi_enabled int )
var Framepointer_enabled = GOARCH == "amd64" || GOARCH == "arm64" && (GOOS == "linux" || GOOS == "darwin" || GOOS == "ios")
Note: must agree with runtime.framepointer_enabled.
var StackGuard = 928*stackGuardMultiplier() + StackSystem
Initialize StackGuard and StackLimit according to target system.
var StackLimit = StackGuard - StackSystem - StackSmall
Functions ¶
func AbsFile ¶
AbsFile returns the absolute filename for file in the given directory, as rewritten by the rewrites argument. For unrewritten paths, AbsFile rewrites a leading $GOROOT prefix to the literal "$GOROOT". If the resulting path is the empty string, the result is "??".
The rewrites argument is a ;-separated list of rewrites. Each rewrite is of the form "prefix" or "prefix=>replace", where prefix must match a leading sequence of path elements and is either removed entirely or replaced by the replacement.
func AddVersionFlag ¶
func AddVersionFlag()
func ApplyRewrites ¶
ApplyRewrites returns the filename for file in the given directory, as rewritten by the rewrites argument.
The rewrites argument is a ;-separated list of rewrites. Each rewrite is of the form "prefix" or "prefix=>replace", where prefix must match a leading sequence of path elements and is either removed entirely or replaced by the replacement.
func DecodeArg ¶
DecodeArg decodes an argument.
This function is public for testing with the parallel encoder.
func DefaultExpstring ¶
func DefaultExpstring() string
func Getgoextlinkenabled ¶
func Getgoextlinkenabled() string
func IsRuntimePackagePath ¶
IsRuntimePackagePath examines 'pkgpath' and returns TRUE if it belongs to the collection of "runtime-related" packages, including "runtime" itself, "reflect", "syscall", and the "runtime/internal/*" packages. The compiler and/or assembler in some cases need to be aware of when they are building such a package, for example to enable features such as ABI selectors in assembly sources.
func PathToPrefix ¶
PathToPrefix converts raw string to the prefix that will be used in the symbol table. All control characters, space, '%' and '"', as well as non-7-bit clean bytes turn into %xx. The period needs escaping only in the last segment of the path, and it makes for happier users if we escape that as little as possible.
func WorkingDir ¶
func WorkingDir() string
WorkingDir returns the current working directory (or "/???" if the directory cannot be identified), with "/" as separator.
Types ¶
type FuncID ¶
type FuncID uint8
A FuncID identifies particular functions that need to be treated specially by the runtime. Note that in some situations involving plugins, there may be multiple copies of a particular special runtime function. Note: this list must match the list in runtime/symtab.go.
const ( FuncID_normal FuncID = iota // not a special function FuncID_runtime_main FuncID_goexit FuncID_jmpdefer FuncID_mcall FuncID_morestack FuncID_mstart FuncID_rt0_go FuncID_asmcgocall FuncID_sigpanic FuncID_runfinq FuncID_gcBgMarkWorker FuncID_systemstack_switch FuncID_systemstack FuncID_cgocallback FuncID_gogo FuncID_externalthreadhandler FuncID_debugCallV1 FuncID_gopanic FuncID_panicwrap FuncID_handleAsyncEvent FuncID_asyncPreempt FuncID_wrapper // any autogenerated code (hash/eq algorithms, method wrappers, etc.) )
type RelocType ¶
type RelocType int16
const ( R_ADDR RelocType = 1 + iota // R_ADDRPOWER relocates a pair of "D-form" instructions (instructions with 16-bit // immediates in the low half of the instruction word), usually addis followed by // another add or a load, inserting the "high adjusted" 16 bits of the address of // the referenced symbol into the immediate field of the first instruction and the // low 16 bits into that of the second instruction. R_ADDRPOWER // R_ADDRARM64 relocates an adrp, add pair to compute the address of the // referenced symbol. R_ADDRARM64 // R_ADDRMIPS (only used on mips/mips64) resolves to the low 16 bits of an external // address, by encoding it into the instruction. R_ADDRMIPS // R_ADDROFF resolves to a 32-bit offset from the beginning of the section // holding the data being relocated to the referenced symbol. R_ADDROFF // R_WEAKADDROFF resolves just like R_ADDROFF but is a weak relocation. // A weak relocation does not make the symbol it refers to reachable, // and is only honored by the linker if the symbol is in some other way // reachable. R_WEAKADDROFF R_SIZE R_CALL R_CALLARM R_CALLARM64 R_CALLIND R_CALLPOWER // R_CALLMIPS (only used on mips64) resolves to non-PC-relative target address // of a CALL (JAL) instruction, by encoding the address into the instruction. R_CALLMIPS // R_CALLRISCV marks RISC-V CALLs for stack checking. R_CALLRISCV R_CONST R_PCREL // R_TLS_LE, used on 386, amd64, and ARM, resolves to the offset of the // thread-local symbol from the thread local base and is used to implement the // "local exec" model for tls access (r.Sym is not set on intel platforms but is // set to a TLS symbol -- runtime.tlsg -- in the linker when externally linking). R_TLS_LE // R_TLS_IE, used 386, amd64, and ARM resolves to the PC-relative offset to a GOT // slot containing the offset from the thread-local symbol from the thread local // base and is used to implemented the "initial exec" model for tls access (r.Sym // is not set on intel platforms but is set to a TLS symbol -- runtime.tlsg -- in // the linker when externally linking). R_TLS_IE R_GOTOFF R_PLT0 R_PLT1 R_PLT2 R_USEFIELD // R_USETYPE resolves to an *rtype, but no relocation is created. The // linker uses this as a signal that the pointed-to type information // should be linked into the final binary, even if there are no other // direct references. (This is used for types reachable by reflection.) R_USETYPE // R_USEIFACE marks a type is converted to an interface in the function this // relocation is applied to. The target is a type descriptor. // This is a marker relocation (0-sized), for the linker's reachabililty // analysis. R_USEIFACE // R_USEIFACEMETHOD marks an interface method that is used in the function // this relocation is applied to. The target is an interface type descriptor. // The addend is the offset of the method in the type descriptor. // This is a marker relocation (0-sized), for the linker's reachabililty // analysis. R_USEIFACEMETHOD // R_METHODOFF resolves to a 32-bit offset from the beginning of the section // holding the data being relocated to the referenced symbol. // It is a variant of R_ADDROFF used when linking from the uncommonType of a // *rtype, and may be set to zero by the linker if it determines the method // text is unreachable by the linked program. R_METHODOFF R_POWER_TOC R_GOTPCREL // R_JMPMIPS (only used on mips64) resolves to non-PC-relative target address // of a JMP instruction, by encoding the address into the instruction. // The stack nosplit check ignores this since it is not a function call. R_JMPMIPS // R_DWARFSECREF resolves to the offset of the symbol from its section. // Target of relocation must be size 4 (in current implementation). R_DWARFSECREF // R_DWARFFILEREF resolves to an index into the DWARF .debug_line // file table for the specified file symbol. Must be applied to an // attribute of form DW_FORM_data4. R_DWARFFILEREF // Set a MOV[NZ] immediate field to bits [15:0] of the offset from the thread // local base to the thread local variable defined by the referenced (thread // local) symbol. Error if the offset does not fit into 16 bits. R_ARM64_TLS_LE // Relocates an ADRP; LD64 instruction sequence to load the offset between // the thread local base and the thread local variable defined by the // referenced (thread local) symbol from the GOT. R_ARM64_TLS_IE // R_ARM64_GOTPCREL relocates an adrp, ld64 pair to compute the address of the GOT // slot of the referenced symbol. R_ARM64_GOTPCREL // R_ARM64_GOT resolves a GOT-relative instruction sequence, usually an adrp // followed by another ld instruction. R_ARM64_GOT // R_ARM64_PCREL resolves a PC-relative addresses instruction sequence, usually an // adrp followed by another add instruction. R_ARM64_PCREL // R_ARM64_LDST8 sets a LD/ST immediate value to bits [11:0] of a local address. R_ARM64_LDST8 // R_ARM64_LDST16 sets a LD/ST immediate value to bits [11:1] of a local address. R_ARM64_LDST16 // R_ARM64_LDST32 sets a LD/ST immediate value to bits [11:2] of a local address. R_ARM64_LDST32 // R_ARM64_LDST64 sets a LD/ST immediate value to bits [11:3] of a local address. R_ARM64_LDST64 // R_ARM64_LDST128 sets a LD/ST immediate value to bits [11:4] of a local address. R_ARM64_LDST128 // R_POWER_TLS_LE is used to implement the "local exec" model for tls // access. It resolves to the offset of the thread-local symbol from the // thread pointer (R13) and inserts this value into the low 16 bits of an // instruction word. R_POWER_TLS_LE // R_POWER_TLS_IE is used to implement the "initial exec" model for tls access. It // relocates a D-form, DS-form instruction sequence like R_ADDRPOWER_DS. It // inserts to the offset of GOT slot for the thread-local symbol from the TOC (the // GOT slot is filled by the dynamic linker with the offset of the thread-local // symbol from the thread pointer (R13)). R_POWER_TLS_IE // R_POWER_TLS marks an X-form instruction such as "MOVD 0(R13)(R31*1), g" as // accessing a particular thread-local symbol. It does not affect code generation // but is used by the system linker when relaxing "initial exec" model code to // "local exec" model code. R_POWER_TLS // R_ADDRPOWER_DS is similar to R_ADDRPOWER above, but assumes the second // instruction is a "DS-form" instruction, which has an immediate field occupying // bits [15:2] of the instruction word. Bits [15:2] of the address of the // relocated symbol are inserted into this field; it is an error if the last two // bits of the address are not 0. R_ADDRPOWER_DS // R_ADDRPOWER_PCREL relocates a D-form, DS-form instruction sequence like // R_ADDRPOWER_DS but inserts the offset of the GOT slot for the referenced symbol // from the TOC rather than the symbol's address. R_ADDRPOWER_GOT // R_ADDRPOWER_PCREL relocates two D-form instructions like R_ADDRPOWER, but // inserts the displacement from the place being relocated to the address of the // relocated symbol instead of just its address. R_ADDRPOWER_PCREL // R_ADDRPOWER_TOCREL relocates two D-form instructions like R_ADDRPOWER, but // inserts the offset from the TOC to the address of the relocated symbol // rather than the symbol's address. R_ADDRPOWER_TOCREL // R_ADDRPOWER_TOCREL relocates a D-form, DS-form instruction sequence like // R_ADDRPOWER_DS but inserts the offset from the TOC to the address of the // relocated symbol rather than the symbol's address. R_ADDRPOWER_TOCREL_DS // R_RISCV_PCREL_ITYPE resolves a 32-bit PC-relative address using an // AUIPC + I-type instruction pair. R_RISCV_PCREL_ITYPE // R_RISCV_PCREL_STYPE resolves a 32-bit PC-relative address using an // AUIPC + S-type instruction pair. R_RISCV_PCREL_STYPE // R_RISCV_TLS_IE_ITYPE resolves a 32-bit TLS initial-exec TOC offset // address using an AUIPC + I-type instruction pair. R_RISCV_TLS_IE_ITYPE // R_RISCV_TLS_IE_STYPE resolves a 32-bit TLS initial-exec TOC offset // address using an AUIPC + S-type instruction pair. R_RISCV_TLS_IE_STYPE // R_PCRELDBL relocates s390x 2-byte aligned PC-relative addresses. // TODO(mundaym): remove once variants can be serialized - see issue 14218. R_PCRELDBL // R_ADDRMIPSU (only used on mips/mips64) resolves to the sign-adjusted "upper" 16 // bits (bit 16-31) of an external address, by encoding it into the instruction. R_ADDRMIPSU // R_ADDRMIPSTLS (only used on mips64) resolves to the low 16 bits of a TLS // address (offset from thread pointer), by encoding it into the instruction. R_ADDRMIPSTLS // R_ADDRCUOFF resolves to a pointer-sized offset from the start of the // symbol's DWARF compile unit. R_ADDRCUOFF // R_WASMIMPORT resolves to the index of the WebAssembly function import. R_WASMIMPORT // R_XCOFFREF (only used on aix/ppc64) prevents garbage collection by ld // of a symbol. This isn't a real relocation, it can be placed in anywhere // in a symbol and target any symbols. R_XCOFFREF )
func (RelocType) IsDirectCall ¶
IsDirectCall reports whether r is a relocation for a direct call. A direct call is a CALL instruction that takes the target address as an immediate. The address is embedded into the instruction, possibly with limited width. An indirect call is a CALL instruction that takes the target address in register or memory.
func (RelocType) IsDirectCallOrJump ¶
IsDirectCallOrJump reports whether r is a relocation for a direct call or a direct jump.
func (RelocType) IsDirectJump ¶
IsDirectJump reports whether r is a relocation for a direct jump. A direct jump is a JMP instruction that takes the target address as an immediate. The address is embedded into the instruction, possibly with limited width. An indirect jump is a JMP instruction that takes the target address in register or memory.
type SymKind ¶
type SymKind uint8
A SymKind describes the kind of memory represented by a symbol.
const ( // An otherwise invalid zero value for the type Sxxx SymKind = iota // Executable instructions STEXT // Read only static data SRODATA // Static data that does not contain any pointers SNOPTRDATA // Static data SDATA // Statically data that is initially all 0s SBSS // Statically data that is initially all 0s and does not contain pointers SNOPTRBSS // Thread-local data that is initially all 0s STLSBSS // Debugging data SDWARFCUINFO SDWARFCONST SDWARFFCN SDWARFABSFCN SDWARFTYPE SDWARFVAR SDWARFRANGE SDWARFLOC SDWARFLINES // ABI alias. An ABI alias symbol is an empty symbol with a // single relocation with 0 size that references the native // function implementation symbol. // // TODO(austin): Remove this and all uses once the compiler // generates real ABI wrappers rather than symbol aliases. SABIALIAS // Coverage instrumentation counter for libfuzzer. SLIBFUZZER_EXTRA_COUNTER )
Defined SymKind values. These are used to index into cmd/link/internal/sym/AbiSymKindToSymKind
TODO(rsc): Give idiomatic Go names.