Documentation
¶
Index ¶
- Constants
- Variables
- func AddGotSym(target *Target, ldr *loader.Loader, syms *ArchSyms, s loader.Sym, ...)
- func AddMachoSym(ldr *loader.Loader, s loader.Sym)
- func AddPELabelSym(ldr *loader.Loader, s loader.Sym)
- func Adddynsym(ldr *loader.Loader, target *Target, syms *ArchSyms, s loader.Sym)
- func Asmbelfsetup()
- func AtExit(f func())
- func CodeblkPad(ctxt *Link, out *OutBuf, addr int64, size int64, pad []byte)
- func DatblkBytes(ctxt *Link, addr int64, size int64) []byte
- func ElfSymForReloc(ctxt *Link, s loader.Sym) int32
- func Elfinit(ctxt *Link)
- func Elfwritedynent(arch *sys.Arch, s *loader.SymbolBuilder, tag elf.DynTag, val uint64)
- func Elfwritedynentsymplus(ctxt *Link, s *loader.SymbolBuilder, tag elf.DynTag, t loader.Sym, add int64)
- func Entryvalue(ctxt *Link) int64
- func Errorf(dummy *int, format string, args ...interface{})
- func Exit(code int)
- func Exitf(format string, a ...interface{})
- func ExtrelocSimple(ldr *loader.Loader, r loader.Reloc) loader.ExtReloc
- func ExtrelocViaOuterSym(ldr *loader.Loader, r loader.Reloc, s loader.Sym) loader.ExtReloc
- func FoldSubSymbolOffset(ldr *loader.Loader, s loader.Sym) (loader.Sym, int64)
- func Lflag(ctxt *Link, arg string)
- func Loaderblk(ctxt *Link, off uint64)
- func MachoAddBind(off int64, targ loader.Sym)
- func MachoAddRebase(s loader.Sym, off int64)
- func Main(arch *sys.Arch, theArch Arch)
- func Peinit(ctxt *Link)
- func PrepareAddmoduledata(ctxt *Link) (*loader.SymbolBuilder, loader.Sym)
- func Rnd(v int64, r int64) int64
- func Xcoffadddynrel(target *Target, ldr *loader.Loader, syms *ArchSyms, s loader.Sym, ...) bool
- func Xcoffinit(ctxt *Link)
- type ArHdr
- type Arch
- type ArchSyms
- type BuildMode
- type Dll
- type ELFArch
- type ElfEhdr
- type ElfPhdr
- type ElfShdr
- type Elfaux
- type Elflib
- type Elfstring
- type ErrorReporter
- type GCProg
- type Hostobj
- type IMAGE_EXPORT_DIRECTORY
- type IMAGE_IMPORT_DESCRIPTOR
- type Imp
- type Link
- func (ctxt *Link) AddTramp(s *loader.SymbolBuilder)
- func (ctxt *Link) CanUsePlugins() bool
- func (ctxt *Link) DynlinkingGo() bool
- func (ctxt *Link) Errorf(s loader.Sym, format string, args ...interface{})
- func (ctxt *Link) IncVersion() int
- func (ctxt *Link) Logf(format string, args ...interface{})
- func (ctxt *Link) MaxVersion() int
- func (ctxt *Link) NeedCodeSign() bool
- type LinkMode
- type MachoHdr
- type MachoLoad
- type MachoPlatform
- type MachoPlatformLoad
- type MachoSect
- type MachoSeg
- type OutBuf
- func (out *OutBuf) Close() error
- func (out *OutBuf) Data() []byte
- func (out *OutBuf) ErrorClose()
- func (out *OutBuf) Mmap(filesize uint64) (err error)
- func (out *OutBuf) Offset() int64
- func (out *OutBuf) Open(name string) error
- func (out *OutBuf) SeekSet(p int64)
- func (out *OutBuf) View(start uint64) (*OutBuf, error)
- func (out *OutBuf) Write(v []byte) (int, error)
- func (out *OutBuf) Write16(v uint16)
- func (out *OutBuf) Write32(v uint32)
- func (out *OutBuf) Write32b(v uint32)
- func (out *OutBuf) Write64(v uint64)
- func (out *OutBuf) Write64b(v uint64)
- func (out *OutBuf) Write8(v uint8)
- func (out *OutBuf) WriteByte(v byte) error
- func (out *OutBuf) WriteString(s string)
- func (out *OutBuf) WriteStringN(s string, n int)
- func (out *OutBuf) WriteStringPad(s string, n int, pad []byte)
- func (out *OutBuf) WriteSym(ldr *loader.Loader, s loader.Sym) []byte
- type Rpath
- type Shlib
- type SymbolType
- type Target
- func (t *Target) CanUsePlugins() bool
- func (t *Target) Is386() bool
- func (t *Target) IsAIX() bool
- func (t *Target) IsAMD64() bool
- func (t *Target) IsARM() bool
- func (t *Target) IsARM64() bool
- func (t *Target) IsBigEndian() bool
- func (t *Target) IsDarwin() bool
- func (t *Target) IsDynlinkingGo() bool
- func (t *Target) IsElf() bool
- func (t *Target) IsExe() bool
- func (t *Target) IsExternal() bool
- func (t *Target) IsFreebsd() bool
- func (t *Target) IsInternal() bool
- func (t *Target) IsLOONG64() bool
- func (t *Target) IsLinux() bool
- func (t *Target) IsMIPS() bool
- func (t *Target) IsMIPS64() bool
- func (t *Target) IsNetbsd() bool
- func (t *Target) IsOpenbsd() bool
- func (t *Target) IsPIE() bool
- func (t *Target) IsPPC64() bool
- func (t *Target) IsPlan9() bool
- func (t *Target) IsPlugin() bool
- func (t *Target) IsRISCV64() bool
- func (t *Target) IsS390X() bool
- func (t *Target) IsShared() bool
- func (t *Target) IsSharedGoLink() bool
- func (t *Target) IsSolaris() bool
- func (t *Target) IsWasm() bool
- func (t *Target) IsWindows() bool
- func (t *Target) UseRelro() bool
- func (t *Target) UsesLibc() bool
- type XcoffAoutHdr64
- type XcoffAuxCSect64
- type XcoffAuxDWARF64
- type XcoffAuxFcn64
- type XcoffAuxFile64
- type XcoffFileHdr64
- type XcoffLdHdr64
- type XcoffLdImportFile64
- type XcoffLdRel64
- type XcoffLdStr64
- type XcoffLdSym64
- type XcoffScnHdr64
- type XcoffSymEnt64
Constants ¶
const ( SARMAG = 8 SAR_HDR = 16 + 44 )
const ( GdbScriptPythonFileId = 1 GdbScriptSchemeFileId = 3 GdbScriptPythonTextId = 4 GdbScriptSchemeTextId = 6 )
https://sourceware.org/gdb/onlinedocs/gdb/dotdebug_005fgdb_005fscripts-section.html Each entry inside .debug_gdb_scripts section begins with a non-null prefix byte that specifies the kind of entry. The following entries are supported:
const ( MaxKeySize = abi.MapMaxKeyBytes MaxValSize = abi.MapMaxElemBytes BucketSize = abi.MapBucketCount )
synthesizemaptypes is way too closely married to runtime/hashmap.c
const ( LINE_BASE = -4 LINE_RANGE = 10 PC_RANGE = (255 - OPCODE_BASE) / LINE_RANGE OPCODE_BASE = 11 )
* Generate a sequence of opcodes that is as short as possible. * See section 6.2.5
const ( ELF64HDRSIZE = 64 ELF64PHDRSIZE = 56 ELF64SHDRSIZE = 64 ELF64RELSIZE = 16 ELF64RELASIZE = 24 ELF64SYMSIZE = 24 ELF32HDRSIZE = 52 ELF32PHDRSIZE = 32 ELF32SHDRSIZE = 40 ELF32SYMSIZE = 16 ELF32RELSIZE = 8 )
* Go linker interface
const ( // No floating point is present in the module (default) MIPS_FPABI_NONE = 0 // FP code in the module uses the FP32 ABI for a 32-bit ABI MIPS_FPABI_ANY = 1 // FP code in the module only uses single precision ABI MIPS_FPABI_SINGLE = 2 // FP code in the module uses soft-float ABI MIPS_FPABI_SOFT = 3 // FP code in the module assumes an FPU with FR=1 and has 12 // callee-saved doubles. Historic, no longer supported. MIPS_FPABI_HIST = 4 // FP code in the module uses the FPXX ABI MIPS_FPABI_FPXX = 5 // FP code in the module uses the FP64 ABI MIPS_FPABI_FP64 = 6 // FP code in the module uses the FP64A ABI MIPS_FPABI_FP64A = 7 )
member of .gnu.attributes of MIPS for fpAbi
const ( ELF_NOTE_NETBSD_NAMESZ = 7 ELF_NOTE_NETBSD_DESCSZ = 4 ELF_NOTE_NETBSD_TAG = 1 ELF_NOTE_NETBSD_VERSION = 700000000 )
NetBSD Signature (as per sys/exec_elf.h)
const ( ELF_NOTE_OPENBSD_NAMESZ = 8 ELF_NOTE_OPENBSD_DESCSZ = 4 ELF_NOTE_OPENBSD_TAG = 1 ELF_NOTE_OPENBSD_VERSION = 0 )
OpenBSD Signature
const ( ELF_NOTE_FREEBSD_NAMESZ = 8 ELF_NOTE_FREEBSD_DESCSZ = 4 ELF_NOTE_FREEBSD_ABI_TAG = 1 ELF_NOTE_FREEBSD_NOINIT_TAG = 2 ELF_NOTE_FREEBSD_FEATURE_CTL_TAG = 4 ELF_NOTE_FREEBSD_VERSION = 1203000 ELF_NOTE_FREEBSD_FCTL_ASLR_DISABLE = 0x1 )
FreeBSD Signature (as per sys/elf_common.h)
const ( ELF_NOTE_BUILDINFO_NAMESZ = 4 ELF_NOTE_BUILDINFO_TAG = 3 )
Build info note
const ( ELF_NOTE_GOPKGLIST_TAG = 1 ELF_NOTE_GOABIHASH_TAG = 2 ELF_NOTE_GODEPS_TAG = 3 ELF_NOTE_GOBUILDID_TAG = 4 )
Go specific notes
const ( MACHO_CPU_AMD64 = 1<<24 | 7 MACHO_CPU_386 = 7 MACHO_SUBCPU_X86 = 3 MACHO_CPU_ARM = 12 MACHO_SUBCPU_ARM = 0 MACHO_SUBCPU_ARMV7 = 9 MACHO_CPU_ARM64 = 1<<24 | 12 MACHO_SUBCPU_ARM64_ALL = 0 MACHO_SUBCPU_ARM64_V8 = 1 MACHO_SUBCPU_ARM64E = 2 MACHO32SYMSIZE = 12 MACHO64SYMSIZE = 16 MACHO_X86_64_RELOC_UNSIGNED = 0 MACHO_X86_64_RELOC_SIGNED = 1 MACHO_X86_64_RELOC_BRANCH = 2 MACHO_X86_64_RELOC_GOT_LOAD = 3 MACHO_X86_64_RELOC_GOT = 4 MACHO_X86_64_RELOC_SUBTRACTOR = 5 MACHO_X86_64_RELOC_SIGNED_1 = 6 MACHO_X86_64_RELOC_SIGNED_2 = 7 MACHO_X86_64_RELOC_SIGNED_4 = 8 MACHO_ARM_RELOC_VANILLA = 0 MACHO_ARM_RELOC_PAIR = 1 MACHO_ARM_RELOC_SECTDIFF = 2 MACHO_ARM_RELOC_BR24 = 5 MACHO_ARM64_RELOC_UNSIGNED = 0 MACHO_ARM64_RELOC_BRANCH26 = 2 MACHO_ARM64_RELOC_PAGE21 = 3 MACHO_ARM64_RELOC_PAGEOFF12 = 4 MACHO_ARM64_RELOC_GOT_LOAD_PAGE21 = 5 MACHO_ARM64_RELOC_GOT_LOAD_PAGEOFF12 = 6 MACHO_ARM64_RELOC_ADDEND = 10 MACHO_GENERIC_RELOC_VANILLA = 0 MACHO_FAKE_GOTPCREL = 100 )
const ( MH_MAGIC = 0xfeedface MH_MAGIC_64 = 0xfeedfacf MH_OBJECT = 0x1 MH_EXECUTE = 0x2 MH_NOUNDEFS = 0x1 MH_DYLDLINK = 0x4 MH_PIE = 0x200000 )
const ( LC_SEGMENT = 0x1 LC_SYMTAB = 0x2 LC_SYMSEG = 0x3 LC_THREAD = 0x4 LC_UNIXTHREAD = 0x5 LC_LOADFVMLIB = 0x6 LC_IDFVMLIB = 0x7 LC_IDENT = 0x8 LC_FVMFILE = 0x9 LC_PREPAGE = 0xa LC_DYSYMTAB = 0xb LC_LOAD_DYLIB = 0xc LC_ID_DYLIB = 0xd LC_LOAD_DYLINKER = 0xe LC_ID_DYLINKER = 0xf LC_PREBOUND_DYLIB = 0x10 LC_ROUTINES = 0x11 LC_SUB_FRAMEWORK = 0x12 LC_SUB_UMBRELLA = 0x13 LC_SUB_CLIENT = 0x14 LC_SUB_LIBRARY = 0x15 LC_TWOLEVEL_HINTS = 0x16 LC_PREBIND_CKSUM = 0x17 LC_LOAD_WEAK_DYLIB = 0x80000018 LC_SEGMENT_64 = 0x19 LC_ROUTINES_64 = 0x1a LC_UUID = 0x1b LC_RPATH = 0x8000001c LC_CODE_SIGNATURE = 0x1d LC_SEGMENT_SPLIT_INFO = 0x1e LC_REEXPORT_DYLIB = 0x8000001f LC_LAZY_LOAD_DYLIB = 0x20 LC_ENCRYPTION_INFO = 0x21 LC_DYLD_INFO = 0x22 LC_DYLD_INFO_ONLY = 0x80000022 LC_LOAD_UPWARD_DYLIB = 0x80000023 LC_VERSION_MIN_MACOSX = 0x24 LC_VERSION_MIN_IPHONEOS = 0x25 LC_FUNCTION_STARTS = 0x26 LC_DYLD_ENVIRONMENT = 0x27 LC_MAIN = 0x80000028 LC_DATA_IN_CODE = 0x29 LC_SOURCE_VERSION = 0x2A LC_DYLIB_CODE_SIGN_DRS = 0x2B LC_ENCRYPTION_INFO_64 = 0x2C LC_LINKER_OPTION = 0x2D LC_LINKER_OPTIMIZATION_HINT = 0x2E LC_VERSION_MIN_TVOS = 0x2F LC_VERSION_MIN_WATCHOS = 0x30 LC_VERSION_NOTE = 0x31 LC_BUILD_VERSION = 0x32 LC_DYLD_EXPORTS_TRIE = 0x80000033 LC_DYLD_CHAINED_FIXUPS = 0x80000034 )
const ( S_REGULAR = 0x0 S_ZEROFILL = 0x1 S_NON_LAZY_SYMBOL_POINTERS = 0x6 S_SYMBOL_STUBS = 0x8 S_MOD_INIT_FUNC_POINTERS = 0x9 S_ATTR_PURE_INSTRUCTIONS = 0x80000000 S_ATTR_DEBUG = 0x02000000 S_ATTR_SOME_INSTRUCTIONS = 0x00000400 )
const ( REBASE_TYPE_POINTER = 1 REBASE_TYPE_TEXT_ABSOLUTE32 = 2 REBASE_TYPE_TEXT_PCREL32 = 3 REBASE_OPCODE_MASK = 0xF0 REBASE_IMMEDIATE_MASK = 0x0F REBASE_OPCODE_DONE = 0x00 REBASE_OPCODE_SET_TYPE_IMM = 0x10 REBASE_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB = 0x20 REBASE_OPCODE_ADD_ADDR_ULEB = 0x30 REBASE_OPCODE_ADD_ADDR_IMM_SCALED = 0x40 REBASE_OPCODE_DO_REBASE_IMM_TIMES = 0x50 REBASE_OPCODE_DO_REBASE_ULEB_TIMES = 0x60 REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB = 0x70 REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB = 0x80 )
rebase table opcode
const ( BIND_TYPE_POINTER = 1 BIND_TYPE_TEXT_ABSOLUTE32 = 2 BIND_TYPE_TEXT_PCREL32 = 3 BIND_SPECIAL_DYLIB_SELF = 0 BIND_SPECIAL_DYLIB_MAIN_EXECUTABLE = -1 BIND_SPECIAL_DYLIB_FLAT_LOOKUP = -2 BIND_SPECIAL_DYLIB_WEAK_LOOKUP = -3 BIND_OPCODE_MASK = 0xF0 BIND_IMMEDIATE_MASK = 0x0F BIND_OPCODE_DONE = 0x00 BIND_OPCODE_SET_DYLIB_ORDINAL_IMM = 0x10 BIND_OPCODE_SET_DYLIB_ORDINAL_ULEB = 0x20 BIND_OPCODE_SET_DYLIB_SPECIAL_IMM = 0x30 BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM = 0x40 BIND_OPCODE_SET_TYPE_IMM = 0x50 BIND_OPCODE_SET_ADDEND_SLEB = 0x60 BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB = 0x70 BIND_OPCODE_ADD_ADDR_ULEB = 0x80 BIND_OPCODE_DO_BIND = 0x90 BIND_OPCODE_DO_BIND_ADD_ADDR_ULEB = 0xA0 BIND_OPCODE_DO_BIND_ADD_ADDR_IMM_SCALED = 0xB0 BIND_OPCODE_DO_BIND_ULEB_TIMES_SKIPPING_ULEB = 0xC0 BIND_OPCODE_THREADED = 0xD0 BIND_SUBOPCODE_THREADED_SET_BIND_ORDINAL_TABLE_SIZE_ULEB = 0x00 BIND_SUBOPCODE_THREADED_APPLY = 0x01 )
bind table opcode
const ( SymKindLocal = 0 + iota SymKindExtdef SymKindUndef NumSymKind )
const ( BUCKETSIZE = 256 * MINFUNC SUBBUCKETS = 16 SUBBUCKETSIZE = BUCKETSIZE / SUBBUCKETS NOIDX = 0x7fffffff )
const ( IMAGE_SCN_CNT_CODE = 0x00000020 IMAGE_SCN_CNT_INITIALIZED_DATA = 0x00000040 IMAGE_SCN_CNT_UNINITIALIZED_DATA = 0x00000080 IMAGE_SCN_LNK_OTHER = 0x00000100 IMAGE_SCN_LNK_INFO = 0x00000200 IMAGE_SCN_LNK_REMOVE = 0x00000800 IMAGE_SCN_LNK_COMDAT = 0x00001000 IMAGE_SCN_GPREL = 0x00008000 IMAGE_SCN_MEM_PURGEABLE = 0x00020000 IMAGE_SCN_MEM_16BIT = 0x00020000 IMAGE_SCN_MEM_LOCKED = 0x00040000 IMAGE_SCN_MEM_PRELOAD = 0x00080000 IMAGE_SCN_ALIGN_1BYTES = 0x00100000 IMAGE_SCN_ALIGN_2BYTES = 0x00200000 IMAGE_SCN_ALIGN_4BYTES = 0x00300000 IMAGE_SCN_ALIGN_8BYTES = 0x00400000 IMAGE_SCN_ALIGN_16BYTES = 0x00500000 IMAGE_SCN_ALIGN_32BYTES = 0x00600000 IMAGE_SCN_ALIGN_64BYTES = 0x00700000 IMAGE_SCN_ALIGN_128BYTES = 0x00800000 IMAGE_SCN_ALIGN_256BYTES = 0x00900000 IMAGE_SCN_ALIGN_512BYTES = 0x00A00000 IMAGE_SCN_ALIGN_1024BYTES = 0x00B00000 IMAGE_SCN_ALIGN_2048BYTES = 0x00C00000 IMAGE_SCN_ALIGN_4096BYTES = 0x00D00000 IMAGE_SCN_ALIGN_8192BYTES = 0x00E00000 IMAGE_SCN_LNK_NRELOC_OVFL = 0x01000000 IMAGE_SCN_MEM_DISCARDABLE = 0x02000000 IMAGE_SCN_MEM_NOT_CACHED = 0x04000000 IMAGE_SCN_MEM_NOT_PAGED = 0x08000000 IMAGE_SCN_MEM_SHARED = 0x10000000 IMAGE_SCN_MEM_EXECUTE = 0x20000000 IMAGE_SCN_MEM_READ = 0x40000000 IMAGE_SCN_MEM_WRITE = 0x80000000 )
const ( IMAGE_SYM_TYPE_NULL = 0 IMAGE_SYM_TYPE_STRUCT = 8 IMAGE_SYM_DTYPE_FUNCTION = 2 IMAGE_SYM_DTYPE_ARRAY = 3 IMAGE_SYM_CLASS_EXTERNAL = 2 IMAGE_SYM_CLASS_STATIC = 3 IMAGE_REL_I386_DIR32 = 0x0006 IMAGE_REL_I386_DIR32NB = 0x0007 IMAGE_REL_I386_SECREL = 0x000B IMAGE_REL_I386_REL32 = 0x0014 IMAGE_REL_AMD64_ADDR64 = 0x0001 IMAGE_REL_AMD64_ADDR32 = 0x0002 IMAGE_REL_AMD64_ADDR32NB = 0x0003 IMAGE_REL_AMD64_REL32 = 0x0004 IMAGE_REL_AMD64_SECREL = 0x000B IMAGE_REL_ARM_ABSOLUTE = 0x0000 IMAGE_REL_ARM_ADDR32 = 0x0001 IMAGE_REL_ARM_ADDR32NB = 0x0002 IMAGE_REL_ARM_BRANCH24 = 0x0003 IMAGE_REL_ARM_BRANCH11 = 0x0004 IMAGE_REL_ARM_SECREL = 0x000F IMAGE_REL_ARM64_ABSOLUTE = 0x0000 IMAGE_REL_ARM64_ADDR32 = 0x0001 IMAGE_REL_ARM64_ADDR32NB = 0x0002 IMAGE_REL_ARM64_BRANCH26 = 0x0003 IMAGE_REL_ARM64_PAGEBASE_REL21 = 0x0004 IMAGE_REL_ARM64_REL21 = 0x0005 IMAGE_REL_ARM64_PAGEOFFSET_12A = 0x0006 IMAGE_REL_ARM64_PAGEOFFSET_12L = 0x0007 IMAGE_REL_ARM64_SECREL = 0x0008 IMAGE_REL_ARM64_SECREL_LOW12A = 0x0009 IMAGE_REL_ARM64_SECREL_HIGH12A = 0x000A IMAGE_REL_ARM64_SECREL_LOW12L = 0x000B IMAGE_REL_ARM64_TOKEN = 0x000C IMAGE_REL_ARM64_SECTION = 0x000D IMAGE_REL_ARM64_ADDR64 = 0x000E IMAGE_REL_ARM64_BRANCH19 = 0x000F IMAGE_REL_ARM64_BRANCH14 = 0x0010 IMAGE_REL_ARM64_REL32 = 0x0011 IMAGE_REL_BASED_HIGHLOW = 3 IMAGE_REL_BASED_DIR64 = 10 )
See https://docs.microsoft.com/en-us/windows/win32/debug/pe-format. TODO(crawshaw): add these constants to debug/pe.
const ( PeMinimumTargetMajorVersion = 6 PeMinimumTargetMinorVersion = 1 )
const ( // Total amount of space to reserve at the start of the file // for File Header, Auxiliary Header, and Section Headers. // May waste some. XCOFFHDRRESERVE = FILHSZ_64 + AOUTHSZ_EXEC64 + SCNHSZ_64*23 // base on dump -o, then rounded from 32B to 64B to // match worst case elf text section alignment on ppc64. XCOFFSECTALIGN int64 = 64 // XCOFF binaries should normally have all its sections position-independent. // However, this is not yet possible for .text because of some R_ADDR relocations // inside RODATA symbols. // .data and .bss are position-independent so their address start inside an unreachable // segment during execution to force segfault if something is wrong. XCOFFTEXTBASE = 0x100000000 XCOFFDATABASE = 0x200000000 )
const ( F_RELFLG = 0x0001 F_EXEC = 0x0002 F_LNNO = 0x0004 F_FDPR_PROF = 0x0010 F_FDPR_OPTI = 0x0020 F_DSA = 0x0040 F_VARPG = 0x0100 F_DYNLOAD = 0x1000 F_SHROBJ = 0x2000 F_LOADONLY = 0x4000 )
Flags that describe the type of the object file.
const ( STYP_DWARF = 0x0010 STYP_TEXT = 0x0020 STYP_DATA = 0x0040 STYP_BSS = 0x0080 STYP_EXCEPT = 0x0100 STYP_INFO = 0x0200 STYP_TDATA = 0x0400 STYP_TBSS = 0x0800 STYP_LOADER = 0x1000 STYP_DEBUG = 0x2000 STYP_TYPCHK = 0x4000 STYP_OVRFLO = 0x8000 )
Flags defining the section type.
const ( SSUBTYP_DWINFO = 0x10000 SSUBTYP_DWLINE = 0x20000 SSUBTYP_DWPBNMS = 0x30000 SSUBTYP_DWPBTYP = 0x40000 SSUBTYP_DWARNGE = 0x50000 SSUBTYP_DWABREV = 0x60000 SSUBTYP_DWSTR = 0x70000 SSUBTYP_DWRNGES = 0x80000 SSUBTYP_DWLOC = 0x90000 SSUBTYP_DWFRAME = 0xA0000 SSUBTYP_DWMAC = 0xB0000 )
const ( FILHSZ_32 = 20 FILHSZ_64 = 24 AOUTHSZ_EXEC32 = 72 AOUTHSZ_EXEC64 = 120 SCNHSZ_32 = 40 SCNHSZ_64 = 72 LDHDRSZ_32 = 32 LDHDRSZ_64 = 56 LDSYMSZ_64 = 24 RELSZ_64 = 14 )
Headers size
const ( // Nscnum N_DEBUG = -2 N_ABS = -1 N_UNDEF = 0 //Ntype SYM_V_INTERNAL = 0x1000 SYM_V_HIDDEN = 0x2000 SYM_V_PROTECTED = 0x3000 SYM_V_EXPORTED = 0x4000 SYM_TYPE_FUNC = 0x0020 )
const ( C_NULL = 0 C_EXT = 2 C_STAT = 3 C_BLOCK = 100 C_FCN = 101 C_FILE = 103 C_HIDEXT = 107 C_BINCL = 108 C_EINCL = 109 C_WEAKEXT = 111 C_DWARF = 112 C_GSYM = 128 C_LSYM = 129 C_PSYM = 130 C_RSYM = 131 C_RPSYM = 132 C_STSYM = 133 C_BCOMM = 135 C_ECOML = 136 C_ECOMM = 137 C_DECL = 140 C_ENTRY = 141 C_FUN = 142 C_BSTAT = 143 C_ESTAT = 144 C_GTLS = 145 C_STTLS = 146 )
Storage Class.
const ( XFT_FN = 0 XFT_CT = 1 XFT_CV = 2 XFT_CD = 128 )
Xftype field
const ( XTY_ER = 0 XTY_SD = 1 XTY_LD = 2 XTY_CM = 3 XTY_WK = 0x8 XTY_EXP = 0x10 XTY_ENT = 0x20 XTY_IMP = 0x40 )
Symbol type field.
const ( XMC_PR = 0 XMC_RO = 1 XMC_DB = 2 XMC_TC = 3 XMC_UA = 4 XMC_RW = 5 XMC_GL = 6 XMC_XO = 7 XMC_SV = 8 XMC_BS = 9 XMC_DS = 10 XMC_UC = 11 XMC_TC0 = 15 XMC_TD = 16 XMC_SV64 = 17 XMC_SV3264 = 18 XMC_TL = 20 XMC_UL = 21 XMC_TE = 22 )
Storage-mapping class.
const ( XCOFF_R_POS = 0x00 XCOFF_R_NEG = 0x01 XCOFF_R_REL = 0x02 XCOFF_R_TOC = 0x03 XCOFF_R_TRL = 0x12 XCOFF_R_TRLA = 0x13 XCOFF_R_GL = 0x05 XCOFF_R_TCL = 0x06 XCOFF_R_RL = 0x0C XCOFF_R_RLA = 0x0D XCOFF_R_REF = 0x0F XCOFF_R_BA = 0x08 XCOFF_R_RBA = 0x18 XCOFF_R_BR = 0x0A XCOFF_R_RBR = 0x1A XCOFF_R_TLS = 0x20 XCOFF_R_TLS_IE = 0x21 XCOFF_R_TLS_LD = 0x22 XCOFF_R_TLS_LE = 0x23 XCOFF_R_TLSM = 0x24 XCOFF_R_TLSML = 0x25 XCOFF_R_TOCU = 0x30 XCOFF_R_TOCL = 0x31 )
const (
ARMAG = "!<arch>\n"
)
const (
ARM_MAGIC_TRAMP_NUMBER = 0x5c000003
)
* Relocation types.
const (
COMPUNITHEADERSIZE = 4 + 2 + 4 + 1
)
const (
ELFRESERVE = 4096
)
* Total amount of space to reserve at the start of the file * for Header, PHeaders, SHeaders, and interp. * May waste some. * On FreeBSD, cannot be larger than a page.
const ELF_NOTE_FREEBSD_NAME = "FreeBSD\x00"
const (
INITIAL_MACHO_HEADR = 4 * 1024
)
* Total amount of space to reserve at the start of the file * for Header, PHeaders, and SHeaders. * May waste some.
const (
MINFUNC = 16
)
const (
NSECT = 400
)
* We use the 64-bit data structures on both 32- and 64-bit machines * in order to write the code just once. The 64-bit data structure is * written in the 32-bit format on the 32-bit machines.
const SYMESZ = 18
const (
U64_TOCMAGIC = 0767
)
Variables ¶
var ( Funcalign int HEADR int32 )
var ( Segtext sym.Segment Segrodata sym.Segment Segrelrodata sym.Segment Segdata sym.Segment Segdwarf sym.Segment Segpdata sym.Segment Segxdata sym.Segment Segments = []*sym.Segment{&Segtext, &Segrodata, &Segrelrodata, &Segdata, &Segdwarf, &Segpdata, &Segxdata} )
var ( FlagC = flag.Bool("c", false, "dump call graph") FlagD = flag.Bool("d", false, "disable dynamic executable") FlagS = flag.Bool("s", false, "disable symbol table") FlagW = flag.Bool("w", false, "disable DWARF generation") FlagDebugTramp = flag.Int("debugtramp", 0, "debug trampolines") FlagDebugTextSize = flag.Int("debugtextsize", 0, "debug text section max size") FlagStrictDups = flag.Int("strictdups", 0, "sanity check duplicate symbol contents during object file reading (1=warn 2=err).") FlagRound = flag.Int("R", -1, "set address rounding `quantum`") FlagTextAddr = flag.Int64("T", -1, "set the start address of text symbols") )
Flags used by the linker. The exported flags are used by the architecture-specific packages.
var ( // PEBASE is the base address for the executable. // It is small for 32-bit and large for 64-bit. PEBASE int64 // SectionAlignment must be greater than or equal to FileAlignment. // The default is the page size for the architecture. PESECTALIGN int64 = 0x1000 // FileAlignment should be a power of 2 between 512 and 64 K, inclusive. // The default is 512. If the SectionAlignment is less than // the architecture's page size, then FileAlignment must match SectionAlignment. PEFILEALIGN int64 = 2 << 8 )
var ( PESECTHEADR int32 PEFILEHEADR int32 )
CarrierSymByType tracks carrier symbols and their sizes.
var ELF_NOTE_BUILDINFO_NAME = []byte("GNU\x00")
var ELF_NOTE_GO_NAME = []byte("Go\x00\x00")
var ELF_NOTE_NETBSD_NAME = []byte("NetBSD\x00")
var ELF_NOTE_OPENBSD_NAME = []byte("OpenBSD\x00")
var Elfstrdat []byte
var (
Nelfsym = 1
)
Functions ¶
func AddMachoSym ¶
AddMachoSym adds s to Mach-O symbol table, used in GenSymLate. Currently only used on ARM64 when external linking.
func Asmbelfsetup ¶
func Asmbelfsetup()
func DatblkBytes ¶
Used only on Wasm for now.
func Elfinit ¶
func Elfinit(ctxt *Link)
Initialize the global variable that describes the ELF header. It will be updated as we write section and prog headers.
func Elfwritedynent ¶
func Elfwritedynentsymplus ¶
func Entryvalue ¶
func Errorf ¶
Errorf logs an error message.
If more than 20 errors have been printed, exit with an error.
Logging an error means that on exit cmd/link will delete any output file and return a non-zero error code.
TODO: remove. Use ctxt.Errorf instead. All remaining calls use nil as first arg.
func Exitf ¶
func Exitf(format string, a ...interface{})
Exitf logs an error message then calls Exit(2).
func ExtrelocSimple ¶
ExtrelocSimple creates a simple external relocation from r, with the same symbol and addend.
func ExtrelocViaOuterSym ¶
ExtrelocViaOuterSym creates an external relocation from r targeting the outer symbol and folding the subsymbol's offset into the addend.
func FoldSubSymbolOffset ¶
FoldSubSymbolOffset computes the offset of symbol s to its top-level outer symbol. Returns the top-level symbol and the offset. This is used in generating external relocations.
func MachoAddBind ¶
func MachoAddRebase ¶
func PrepareAddmoduledata ¶
func PrepareAddmoduledata(ctxt *Link) (*loader.SymbolBuilder, loader.Sym)
PrepareAddmoduledata returns a symbol builder that target-specific code can use to build up the linker-generated go.link.addmoduledata function, along with the sym for runtime.addmoduledata itself. If this function is not needed (for example in cases where we're linking a module that contains the runtime) the returned builder will be nil.
Types ¶
type Arch ¶
type Arch struct { Funcalign int Maxalign int Minalign int Dwarfregsp int Dwarfreglr int // Threshold of total text size, used for trampoline insertion. If the total // text size is smaller than TrampLimit, we won't need to insert trampolines. // It is pretty close to the offset range of a direct CALL machine instruction. // We leave some room for extra stuff like PLT stubs. TrampLimit uint64 // Empty spaces between codeblocks will be padded with this value. // For example an architecture might want to pad with a trap instruction to // catch wayward programs. Architectures that do not define a padding value // are padded with zeros. CodePad []byte // Plan 9 variables. Plan9Magic uint32 Plan9_64Bit bool Adddynrel func(*Target, *loader.Loader, *ArchSyms, loader.Sym, loader.Reloc, int) bool Archinit func(*Link) // Archreloc is an arch-specific hook that assists in relocation processing // (invoked by 'relocsym'); it handles target-specific relocation tasks. // Here "rel" is the current relocation being examined, "sym" is the symbol // containing the chunk of data to which the relocation applies, and "off" // is the contents of the to-be-relocated data item (from sym.P). Return // value is the appropriately relocated value (to be written back to the // same spot in sym.P), number of external _host_ relocations needed (i.e. // ELF/Mach-O/etc. relocations, not Go relocations, this must match ELF.Reloc1, // etc.), and a boolean indicating success/failure (a failing value indicates // a fatal error). Archreloc func(*Target, *loader.Loader, *ArchSyms, loader.Reloc, loader.Sym, int64) (relocatedOffset int64, nExtReloc int, ok bool) // Archrelocvariant is a second arch-specific hook used for // relocation processing; it handles relocations where r.Type is // insufficient to describe the relocation (r.Variant != // sym.RV_NONE). Here "rel" is the relocation being applied, "sym" // is the symbol containing the chunk of data to which the // relocation applies, and "off" is the contents of the // to-be-relocated data item (from sym.P). Return is an updated // offset value. Archrelocvariant func(target *Target, ldr *loader.Loader, rel loader.Reloc, rv sym.RelocVariant, sym loader.Sym, offset int64, data []byte) (relocatedOffset int64) // Generate a trampoline for a call from s to rs if necessary. ri is // index of the relocation. Trampoline func(ctxt *Link, ldr *loader.Loader, ri int, rs, s loader.Sym) // Assembling the binary breaks into two phases, writing the code/data/ // dwarf information (which is rather generic), and some more architecture // specific work like setting up the elf headers/dynamic relocations, etc. // The phases are called "Asmb" and "Asmb2". Asmb2 needs to be defined for // every architecture, but only if architecture has an Asmb function will // it be used for assembly. Otherwise a generic assembly Asmb function is // used. Asmb func(*Link, *loader.Loader) Asmb2 func(*Link, *loader.Loader) // Extreloc is an arch-specific hook that converts a Go relocation to an // external relocation. Return the external relocation and whether it is // needed. Extreloc func(*Target, *loader.Loader, loader.Reloc, loader.Sym) (loader.ExtReloc, bool) Gentext func(*Link, *loader.Loader) Machoreloc1 func(*sys.Arch, *OutBuf, *loader.Loader, loader.Sym, loader.ExtReloc, int64) bool MachorelocSize uint32 PEreloc1 func(*sys.Arch, *OutBuf, *loader.Loader, loader.Sym, loader.ExtReloc, int64) bool Xcoffreloc1 func(*sys.Arch, *OutBuf, *loader.Loader, loader.Sym, loader.ExtReloc, int64) bool // Generate additional symbols for the native symbol table just prior to // code generation. GenSymsLate func(*Link, *loader.Loader) // TLSIEtoLE converts a TLS Initial Executable relocation to // a TLS Local Executable relocation. // // This is possible when a TLS IE relocation refers to a local // symbol in an executable, which is typical when internally // linking PIE binaries. TLSIEtoLE func(P []byte, off, size int) // optional override for assignAddress AssignAddress func(ldr *loader.Loader, sect *sym.Section, n int, s loader.Sym, va uint64, isTramp bool) (*sym.Section, int, uint64) // ELF specific information. ELF ELFArch }
type ArchSyms ¶
type ArchSyms struct { Rel loader.Sym Rela loader.Sym RelPLT loader.Sym RelaPLT loader.Sym LinkEditGOT loader.Sym LinkEditPLT loader.Sym TOC loader.Sym DotTOC []loader.Sym GOT loader.Sym PLT loader.Sym GOTPLT loader.Sym Tlsg loader.Sym Tlsoffset int Dynamic loader.Sym DynSym loader.Sym DynStr loader.Sym // contains filtered or unexported fields }
ArchSyms holds a number of architecture specific symbols used during relocation. Rather than allowing them universal access to all symbols, we keep a subset for relocation application.
type BuildMode ¶
type BuildMode uint8
A BuildMode indicates the sort of object we are building.
Possible build modes are the same as those for the -buildmode flag in cmd/go, and are documented in 'go help buildmode'.
type ELFArch ¶
type ELFArch struct { Androiddynld string Linuxdynld string LinuxdynldMusl string Freebsddynld string Netbsddynld string Openbsddynld string Dragonflydynld string Solarisdynld string Reloc1 func(*Link, *OutBuf, *loader.Loader, loader.Sym, loader.ExtReloc, int, int64) bool RelocSize uint32 SetupPLT func(ctxt *Link, plt, gotplt *loader.SymbolBuilder, dynamic loader.Sym) // DynamicReadOnly can be set to true to make the .dynamic // section read-only. By default it is writable. // This is used by MIPS targets. DynamicReadOnly bool }
ELFArch includes target-specific hooks for ELF targets. This is initialized by the target-specific Init function called by the linker's main function in cmd/link/main.go.
type ErrorReporter ¶
type ErrorReporter struct { loader.ErrorReporter SymName symNameFn // contains filtered or unexported fields }
ErrorReporter is used to make error reporting thread safe.
type IMAGE_EXPORT_DIRECTORY ¶
type IMAGE_IMPORT_DESCRIPTOR ¶
type Link ¶
type Link struct { Target ErrorReporter ArchSyms Out *OutBuf Debugvlog int Bso *bufio.Writer Loaded bool Libdir []string Library []*sym.Library LibraryByPkg map[string]*sym.Library Shlibs []Shlib Textp []loader.Sym Moduledata loader.Sym PackageFile map[string]string PackageShlib map[string]string // contains filtered or unexported fields }
Link holds the context for writing object code from a compiler or for reading that input into the linker.
func (*Link) AddTramp ¶
func (ctxt *Link) AddTramp(s *loader.SymbolBuilder)
add a trampoline with symbol s (to be laid down after the current function)
func (*Link) CanUsePlugins ¶
CanUsePlugins reports whether a plugins can be used
func (*Link) DynlinkingGo ¶
DynlinkingGo reports whether we are producing Go code that can live in separate shared libraries linked together at runtime.
func (*Link) Errorf ¶
Errorf method logs an error message.
If more than 20 errors have been printed, exit with an error.
Logging an error means that on exit cmd/link will delete any output file and return a non-zero error code.
func (*Link) IncVersion ¶
Allocate a new version (i.e. symbol namespace).
func (*Link) NeedCodeSign ¶
NeedCodeSign reports whether we need to code-sign the output binary.
type LinkMode ¶
type LinkMode uint8
LinkMode indicates whether an external linker is used for the final link.
type MachoPlatform ¶
type MachoPlatform int
const ( PLATFORM_MACOS MachoPlatform = 1 PLATFORM_IOS MachoPlatform = 2 PLATFORM_TVOS MachoPlatform = 3 PLATFORM_WATCHOS MachoPlatform = 4 PLATFORM_BRIDGEOS MachoPlatform = 5 )
type MachoPlatformLoad ¶
type MachoPlatformLoad struct {
// contains filtered or unexported fields
}
MachoPlatformLoad represents a LC_VERSION_MIN_* or LC_BUILD_VERSION load command.
type OutBuf ¶
type OutBuf struct {
// contains filtered or unexported fields
}
OutBuf is a buffered file writer.
It is similar to the Writer in cmd/internal/bio with a few small differences.
First, it tracks the output architecture and uses it to provide endian helpers.
Second, it provides a very cheap offset counter that doesn't require any system calls to read the value.
Third, it also mmaps the output file (if available). The intended usage is:
- Mmap the output file
- Write the content
- possibly apply any edits in the output buffer
- possibly write more content to the file. These writes take place in a heap backed buffer that will get synced to disk.
- Munmap the output file
And finally, it provides a mechanism by which you can multithread the writing of output files. This mechanism is accomplished by copying a OutBuf, and using it in the thread/goroutine.
Parallel OutBuf is intended to be used like:
func write(out *OutBuf) { var wg sync.WaitGroup for i := 0; i < 10; i++ { wg.Add(1) view, err := out.View(start[i]) if err != nil { // handle output continue } go func(out *OutBuf, i int) { // do output wg.Done() }(view, i) } wg.Wait() }
func (*OutBuf) ErrorClose ¶
func (out *OutBuf) ErrorClose()
ErrorClose closes the output file (if any). It is supposed to be called only at exit on error, so it doesn't do any clean up or buffer flushing, just closes the file.
func (*OutBuf) Mmap ¶
Mmap maps the output file with the given size. It unmaps the old mapping if it is already mapped. It also flushes any in-heap data to the new mapping.
func (*OutBuf) WriteString ¶
func (*OutBuf) WriteStringN ¶
WriteStringN writes the first n bytes of s. If n is larger than len(s) then it is padded with zero bytes.
func (*OutBuf) WriteStringPad ¶
WriteStringPad writes the first n bytes of s. If n is larger than len(s) then it is padded with the bytes in pad (repeated as needed).
type SymbolType ¶
type SymbolType int8
const ( // see also https://9p.io/magic/man2html/1/nm TextSym SymbolType = 'T' DataSym SymbolType = 'D' BSSSym SymbolType = 'B' UndefinedSym SymbolType = 'U' TLSSym SymbolType = 't' FrameSym SymbolType = 'm' ParamSym SymbolType = 'p' AutoSym SymbolType = 'a' // Deleted auto (not a real sym, just placeholder for type) DeletedAutoSym = 'x' )
type Target ¶
type Target struct { Arch *sys.Arch HeadType objabi.HeadType LinkMode LinkMode BuildMode BuildMode IsELF bool // contains filtered or unexported fields }
Target holds the configuration we're building for.
func (*Target) CanUsePlugins ¶
func (*Target) IsBigEndian ¶
func (*Target) IsDynlinkingGo ¶
func (*Target) IsExternal ¶
func (*Target) IsInternal ¶
func (*Target) IsSharedGoLink ¶
type XcoffAoutHdr64 ¶
type XcoffAoutHdr64 struct { Omagic int16 Ovstamp int16 Odebugger uint32 Otextstart uint64 Odatastart uint64 Otoc uint64 Osnentry int16 Osntext int16 Osndata int16 Osntoc int16 Osnloader int16 Osnbss int16 Oalgntext int16 Oalgndata int16 Omodtype [2]byte Ocpuflag uint8 Ocputype uint8 Otextpsize uint8 Odatapsize uint8 Ostackpsize uint8 Oflags uint8 Otsize uint64 Odsize uint64 Obsize uint64 Oentry uint64 Omaxstack uint64 Omaxdata uint64 Osntdata int16 Osntbss int16 Ox64flags uint16 Oresv3a int16 Oresv3 [2]int32 }
Auxiliary Header
type XcoffAuxCSect64 ¶
type XcoffAuxCSect64 struct { Xscnlenlo uint32 Xparmhash uint32 Xsnhash uint16 Xsmtyp uint8 Xsmclas uint8 Xscnlenhi uint32 Xpad uint8 Xauxtype uint8 }
csect Auxiliary Entry.
type XcoffAuxDWARF64 ¶
DWARF Auxiliary Entry
type XcoffAuxFcn64 ¶
type XcoffAuxFcn64 struct { Xlnnoptr uint64 Xfsize uint32 Xendndx uint32 Xpad uint8 Xauxtype uint8 }
Function Auxiliary Entry
type XcoffAuxFile64 ¶
type XcoffAuxFile64 struct { Xzeroes uint32 Xoffset uint32 X_pad1 [6]byte Xftype uint8 X_pad2 [2]byte Xauxtype uint8 }
File Auxiliary Entry
type XcoffFileHdr64 ¶
type XcoffFileHdr64 struct { Fmagic uint16 Fnscns uint16 Ftimedat int32 Fsymptr uint64 Fopthdr uint16 Fflags uint16 Fnsyms int32 }
File Header
type XcoffLdHdr64 ¶
type XcoffLdHdr64 struct { Lversion int32 Lnsyms int32 Lnreloc int32 Listlen uint32 Lnimpid int32 Lstlen uint32 Limpoff uint64 Lstoff uint64 Lsymoff uint64 Lrldoff uint64 }
Loader Header
type XcoffLdImportFile64 ¶
type XcoffLdRel64 ¶
type XcoffLdStr64 ¶
type XcoffLdStr64 struct {
// contains filtered or unexported fields
}
type XcoffLdSym64 ¶
type XcoffLdSym64 struct { Lvalue uint64 Loffset uint32 Lscnum int16 Lsmtype int8 Lsmclas int8 Lifile int32 Lparm uint32 }
Loader Symbol
Source Files
¶
- ar.go
- asmb.go
- config.go
- data.go
- deadcode.go
- decodesym.go
- dwarf.go
- elf.go
- errors.go
- execarchive.go
- go.go
- heap.go
- inittask.go
- ld.go
- lib.go
- link.go
- macho.go
- macho_combine_dwarf.go
- main.go
- outbuf.go
- outbuf_linux.go
- outbuf_mmap.go
- outbuf_notdarwin.go
- pcln.go
- pe.go
- seh.go
- stackcheck.go
- sym.go
- symtab.go
- target.go
- typelink.go
- util.go
- xcoff.go