...

Package ld

import "cmd/link/internal/ld"
Overview
Index

Overview ▾

Index ▾

Constants
Variables
func Adddynsym(ctxt *Link, s *sym.Symbol)
func Addstring(s *sym.Symbol, str string) int64
func Asmbelf(ctxt *Link, symo int64)
func Asmbelfsetup()
func Asmbmacho(ctxt *Link)
func Asmbpe(ctxt *Link)
func Asmbxcoff(ctxt *Link, fileoff int64)
func Asmelfsym(ctxt *Link)
func Asmplan9sym(ctxt *Link)
func AtExit(f func())
func Codeblk(ctxt *Link, addr int64, size int64)
func CodeblkPad(ctxt *Link, addr int64, size int64, pad []byte)
func Cputime() float64
func Datblk(ctxt *Link, addr int64, size int64)
func DatblkBytes(ctxt *Link, addr int64, size int64) []byte
func Domacholink(ctxt *Link) int64
func Dwarfblk(ctxt *Link, addr int64, size int64)
func ELF32_R_INFO(sym uint32, type_ uint32) uint32
func ELF32_R_SYM(info uint32) uint32
func ELF32_R_TYPE(info uint32) uint32
func ELF32_ST_BIND(info uint8) uint8
func ELF32_ST_INFO(bind uint8, type_ uint8) uint8
func ELF32_ST_TYPE(info uint8) uint8
func ELF32_ST_VISIBILITY(oth uint8) uint8
func ELF64_R_INFO(sym uint32, type_ uint32) uint64
func ELF64_R_SYM(info uint64) uint32
func ELF64_R_TYPE(info uint64) uint32
func ELF64_ST_BIND(info uint8) uint8
func ELF64_ST_INFO(bind uint8, type_ uint8) uint8
func ELF64_ST_TYPE(info uint8) uint8
func ELF64_ST_VISIBILITY(oth uint8) uint8
func Elfemitreloc(ctxt *Link)
func Elfinit(ctxt *Link)
func Elfwritedynent(ctxt *Link, s *sym.Symbol, tag int, val uint64)
func Elfwritedynentsymplus(ctxt *Link, s *sym.Symbol, tag int, t *sym.Symbol, add int64)
func Entryvalue(ctxt *Link) int64
func Errorf(s *sym.Symbol, format string, args ...interface{})
func Exit(code int)
func Exitf(format string, a ...interface{})
func Lflag(ctxt *Link, arg string)
func Loaderblk(ctxt *Link, off uint64)
func Machoemitreloc(ctxt *Link)
func Main(arch *sys.Arch, theArch Arch)
func Peinit(ctxt *Link)
func Rnd(v int64, r int64) int64
func Symaddr(s *sym.Symbol) int64
func Xcoffadddynrel(ctxt *Link, s *sym.Symbol, r *sym.Reloc) bool
func Xcoffinit(ctxt *Link)
type ArHdr
type Arch
type BuildMode
    func (mode *BuildMode) Set(s string) error
    func (mode *BuildMode) String() string
type Dll
type ElfEhdr
type ElfPhdr
type ElfShdr
type Elfaux
type Elflib
type Elfstring
type GCProg
    func (p *GCProg) AddSym(s *sym.Symbol)
    func (p *GCProg) End(size int64)
    func (p *GCProg) Init(ctxt *Link, name string)
type Hostobj
type IMAGE_EXPORT_DIRECTORY
type IMAGE_IMPORT_DESCRIPTOR
type Imp
type Link
    func (ctxt *Link) AddTramp(s *sym.Symbol)
    func (ctxt *Link) CanUsePlugins() bool
    func (ctxt *Link) DynlinkingGo() bool
    func (ctxt *Link) ErrorUnresolved(s *sym.Symbol, r *sym.Reloc)
    func (ctxt *Link) FixedFrameSize() int64
    func (ctxt *Link) Logf(format string, args ...interface{})
    func (ctxt *Link) UseRelro() bool
type LinkMode
    func (mode *LinkMode) Set(s string) error
    func (mode *LinkMode) String() string
type MachoHdr
type MachoLoad
type MachoPlatform
type MachoPlatformLoad
type MachoSect
type MachoSeg
type OutBuf
    func (out *OutBuf) Flush()
    func (out *OutBuf) Mmap(filesize uint64) error
    func (out *OutBuf) Msync() error
    func (out *OutBuf) Munmap()
    func (out *OutBuf) Offset() int64
    func (out *OutBuf) SeekSet(p int64)
    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(s *sym.Symbol)
type PCIter
type Pkg
type Rpath
    func (r *Rpath) Set(val string) error
    func (r *Rpath) String() string
type Shlib
type SymbolType
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

Package files

ar.go config.go data.go deadcode.go decodesym.go dwarf.go elf.go go.go ld.go lib.go link.go macho.go macho_combine_dwarf.go main.go outbuf.go outbuf_mmap.go pcln.go pe.go sym.go symtab.go typelink.go util.go xcoff.go

Constants

const (
    SARMAG  = 8
    SAR_HDR = 16 + 44
)
const (
    MaxKeySize = 128
    MaxValSize = 128
    BucketSize = 8
)

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 (
    EI_MAG0              = 0
    EI_MAG1              = 1
    EI_MAG2              = 2
    EI_MAG3              = 3
    EI_CLASS             = 4
    EI_DATA              = 5
    EI_VERSION           = 6
    EI_OSABI             = 7
    EI_ABIVERSION        = 8
    OLD_EI_BRAND         = 8
    EI_PAD               = 9
    EI_NIDENT            = 16
    ELFMAG0              = 0x7f
    ELFMAG1              = 'E'
    ELFMAG2              = 'L'
    ELFMAG3              = 'F'
    SELFMAG              = 4
    EV_NONE              = 0
    EV_CURRENT           = 1
    ELFCLASSNONE         = 0
    ELFCLASS32           = 1
    ELFCLASS64           = 2
    ELFDATANONE          = 0
    ELFDATA2LSB          = 1
    ELFDATA2MSB          = 2
    ELFOSABI_NONE        = 0
    ELFOSABI_HPUX        = 1
    ELFOSABI_NETBSD      = 2
    ELFOSABI_LINUX       = 3
    ELFOSABI_HURD        = 4
    ELFOSABI_86OPEN      = 5
    ELFOSABI_SOLARIS     = 6
    ELFOSABI_AIX         = 7
    ELFOSABI_IRIX        = 8
    ELFOSABI_FREEBSD     = 9
    ELFOSABI_TRU64       = 10
    ELFOSABI_MODESTO     = 11
    ELFOSABI_OPENBSD     = 12
    ELFOSABI_OPENVMS     = 13
    ELFOSABI_NSK         = 14
    ELFOSABI_ARM         = 97
    ELFOSABI_STANDALONE  = 255
    ELFOSABI_SYSV        = ELFOSABI_NONE
    ELFOSABI_MONTEREY    = ELFOSABI_AIX
    ET_NONE              = 0
    ET_REL               = 1
    ET_EXEC              = 2
    ET_DYN               = 3
    ET_CORE              = 4
    ET_LOOS              = 0xfe00
    ET_HIOS              = 0xfeff
    ET_LOPROC            = 0xff00
    ET_HIPROC            = 0xffff
    EM_NONE              = 0
    EM_M32               = 1
    EM_SPARC             = 2
    EM_386               = 3
    EM_68K               = 4
    EM_88K               = 5
    EM_860               = 7
    EM_MIPS              = 8
    EM_S370              = 9
    EM_MIPS_RS3_LE       = 10
    EM_PARISC            = 15
    EM_VPP500            = 17
    EM_SPARC32PLUS       = 18
    EM_960               = 19
    EM_PPC               = 20
    EM_PPC64             = 21
    EM_S390              = 22
    EM_V800              = 36
    EM_FR20              = 37
    EM_RH32              = 38
    EM_RCE               = 39
    EM_ARM               = 40
    EM_SH                = 42
    EM_SPARCV9           = 43
    EM_TRICORE           = 44
    EM_ARC               = 45
    EM_H8_300            = 46
    EM_H8_300H           = 47
    EM_H8S               = 48
    EM_H8_500            = 49
    EM_IA_64             = 50
    EM_MIPS_X            = 51
    EM_COLDFIRE          = 52
    EM_68HC12            = 53
    EM_MMA               = 54
    EM_PCP               = 55
    EM_NCPU              = 56
    EM_NDR1              = 57
    EM_STARCORE          = 58
    EM_ME16              = 59
    EM_ST100             = 60
    EM_TINYJ             = 61
    EM_X86_64            = 62
    EM_AARCH64           = 183
    EM_486               = 6
    EM_MIPS_RS4_BE       = 10
    EM_ALPHA_STD         = 41
    EM_ALPHA             = 0x9026
    SHN_UNDEF            = 0
    SHN_LORESERVE        = 0xff00
    SHN_LOPROC           = 0xff00
    SHN_HIPROC           = 0xff1f
    SHN_LOOS             = 0xff20
    SHN_HIOS             = 0xff3f
    SHN_ABS              = 0xfff1
    SHN_COMMON           = 0xfff2
    SHN_XINDEX           = 0xffff
    SHN_HIRESERVE        = 0xffff
    SHT_NULL             = 0
    SHT_PROGBITS         = 1
    SHT_SYMTAB           = 2
    SHT_STRTAB           = 3
    SHT_RELA             = 4
    SHT_HASH             = 5
    SHT_DYNAMIC          = 6
    SHT_NOTE             = 7
    SHT_NOBITS           = 8
    SHT_REL              = 9
    SHT_SHLIB            = 10
    SHT_DYNSYM           = 11
    SHT_INIT_ARRAY       = 14
    SHT_FINI_ARRAY       = 15
    SHT_PREINIT_ARRAY    = 16
    SHT_GROUP            = 17
    SHT_SYMTAB_SHNDX     = 18
    SHT_LOOS             = 0x60000000
    SHT_HIOS             = 0x6fffffff
    SHT_GNU_VERDEF       = 0x6ffffffd
    SHT_GNU_VERNEED      = 0x6ffffffe
    SHT_GNU_VERSYM       = 0x6fffffff
    SHT_LOPROC           = 0x70000000
    SHT_ARM_ATTRIBUTES   = 0x70000003
    SHT_HIPROC           = 0x7fffffff
    SHT_LOUSER           = 0x80000000
    SHT_HIUSER           = 0xffffffff
    SHF_WRITE            = 0x1
    SHF_ALLOC            = 0x2
    SHF_EXECINSTR        = 0x4
    SHF_MERGE            = 0x10
    SHF_STRINGS          = 0x20
    SHF_INFO_LINK        = 0x40
    SHF_LINK_ORDER       = 0x80
    SHF_OS_NONCONFORMING = 0x100
    SHF_GROUP            = 0x200
    SHF_TLS              = 0x400
    SHF_MASKOS           = 0x0ff00000
    SHF_MASKPROC         = 0xf0000000
    PT_NULL              = 0
    PT_LOAD              = 1
    PT_DYNAMIC           = 2
    PT_INTERP            = 3
    PT_NOTE              = 4
    PT_SHLIB             = 5
    PT_PHDR              = 6
    PT_TLS               = 7
    PT_LOOS              = 0x60000000
    PT_HIOS              = 0x6fffffff
    PT_LOPROC            = 0x70000000
    PT_HIPROC            = 0x7fffffff
    PT_GNU_STACK         = 0x6474e551
    PT_GNU_RELRO         = 0x6474e552
    PT_PAX_FLAGS         = 0x65041580
    PT_SUNWSTACK         = 0x6ffffffb
    PF_X                 = 0x1
    PF_W                 = 0x2
    PF_R                 = 0x4
    PF_MASKOS            = 0x0ff00000
    PF_MASKPROC          = 0xf0000000
    DT_NULL              = 0
    DT_NEEDED            = 1
    DT_PLTRELSZ          = 2
    DT_PLTGOT            = 3
    DT_HASH              = 4
    DT_STRTAB            = 5
    DT_SYMTAB            = 6
    DT_RELA              = 7
    DT_RELASZ            = 8
    DT_RELAENT           = 9
    DT_STRSZ             = 10
    DT_SYMENT            = 11
    DT_INIT              = 12
    DT_FINI              = 13
    DT_SONAME            = 14
    DT_RPATH             = 15
    DT_SYMBOLIC          = 16
    DT_REL               = 17
    DT_RELSZ             = 18
    DT_RELENT            = 19
    DT_PLTREL            = 20
    DT_DEBUG             = 21
    DT_TEXTREL           = 22
    DT_JMPREL            = 23
    DT_BIND_NOW          = 24
    DT_INIT_ARRAY        = 25
    DT_FINI_ARRAY        = 26
    DT_INIT_ARRAYSZ      = 27
    DT_FINI_ARRAYSZ      = 28
    DT_RUNPATH           = 29
    DT_FLAGS             = 30
    DT_ENCODING          = 32
    DT_PREINIT_ARRAY     = 32
    DT_PREINIT_ARRAYSZ   = 33
    DT_LOOS              = 0x6000000d
    DT_HIOS              = 0x6ffff000
    DT_LOPROC            = 0x70000000
    DT_HIPROC            = 0x7fffffff
    DT_VERNEED           = 0x6ffffffe
    DT_VERNEEDNUM        = 0x6fffffff
    DT_VERSYM            = 0x6ffffff0
    DT_PPC64_GLINK       = DT_LOPROC + 0
    DT_PPC64_OPT         = DT_LOPROC + 3
    DF_ORIGIN            = 0x0001
    DF_SYMBOLIC          = 0x0002
    DF_TEXTREL           = 0x0004
    DF_BIND_NOW          = 0x0008
    DF_STATIC_TLS        = 0x0010
    NT_PRSTATUS          = 1
    NT_FPREGSET          = 2
    NT_PRPSINFO          = 3
    STB_LOCAL            = 0
    STB_GLOBAL           = 1
    STB_WEAK             = 2
    STB_LOOS             = 10
    STB_HIOS             = 12
    STB_LOPROC           = 13
    STB_HIPROC           = 15
    STT_NOTYPE           = 0
    STT_OBJECT           = 1
    STT_FUNC             = 2
    STT_SECTION          = 3
    STT_FILE             = 4
    STT_COMMON           = 5
    STT_TLS              = 6
    STT_LOOS             = 10
    STT_HIOS             = 12
    STT_LOPROC           = 13
    STT_HIPROC           = 15
    STV_DEFAULT          = 0x0
    STV_INTERNAL         = 0x1
    STV_HIDDEN           = 0x2
    STV_PROTECTED        = 0x3
    STN_UNDEF            = 0
)
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 (
    ELF_NOTE_NETBSD_NAMESZ  = 7
    ELF_NOTE_NETBSD_DESCSZ  = 4
    ELF_NOTE_NETBSD_TAG     = 1
    ELF_NOTE_NETBSD_VERSION = 599000000 /* NetBSD 5.99 */
)

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_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
    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_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
)
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
)
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 (
    SymKindLocal = 0 + iota
    SymKindExtdef
    SymKindUndef
    NumSymKind
)
const (
    BUCKETSIZE    = 256 * MINFUNC
    SUBBUCKETS    = 16
    SUBBUCKETSIZE = BUCKETSIZE / SUBBUCKETS
    NOIDX         = 0x7fffffff
)
const (
    IMAGE_FILE_MACHINE_I386               = 0x14c
    IMAGE_FILE_MACHINE_AMD64              = 0x8664
    IMAGE_FILE_MACHINE_ARM                = 0x1c0
    IMAGE_FILE_MACHINE_ARMNT              = 0x1c4
    IMAGE_FILE_RELOCS_STRIPPED            = 0x0001
    IMAGE_FILE_EXECUTABLE_IMAGE           = 0x0002
    IMAGE_FILE_LINE_NUMS_STRIPPED         = 0x0004
    IMAGE_FILE_LARGE_ADDRESS_AWARE        = 0x0020
    IMAGE_FILE_32BIT_MACHINE              = 0x0100
    IMAGE_FILE_DEBUG_STRIPPED             = 0x0200
    IMAGE_SCN_CNT_CODE                    = 0x00000020
    IMAGE_SCN_CNT_INITIALIZED_DATA        = 0x00000040
    IMAGE_SCN_CNT_UNINITIALIZED_DATA      = 0x00000080
    IMAGE_SCN_MEM_EXECUTE                 = 0x20000000
    IMAGE_SCN_MEM_READ                    = 0x40000000
    IMAGE_SCN_MEM_WRITE                   = 0x80000000
    IMAGE_SCN_MEM_DISCARDABLE             = 0x2000000
    IMAGE_SCN_LNK_NRELOC_OVFL             = 0x1000000
    IMAGE_SCN_ALIGN_32BYTES               = 0x600000
    IMAGE_DIRECTORY_ENTRY_EXPORT          = 0
    IMAGE_DIRECTORY_ENTRY_IMPORT          = 1
    IMAGE_DIRECTORY_ENTRY_RESOURCE        = 2
    IMAGE_DIRECTORY_ENTRY_EXCEPTION       = 3
    IMAGE_DIRECTORY_ENTRY_SECURITY        = 4
    IMAGE_DIRECTORY_ENTRY_BASERELOC       = 5
    IMAGE_DIRECTORY_ENTRY_DEBUG           = 6
    IMAGE_DIRECTORY_ENTRY_COPYRIGHT       = 7
    IMAGE_DIRECTORY_ENTRY_ARCHITECTURE    = 7
    IMAGE_DIRECTORY_ENTRY_GLOBALPTR       = 8
    IMAGE_DIRECTORY_ENTRY_TLS             = 9
    IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG     = 10
    IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT    = 11
    IMAGE_DIRECTORY_ENTRY_IAT             = 12
    IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT    = 13
    IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR  = 14
    IMAGE_SUBSYSTEM_WINDOWS_GUI           = 2
    IMAGE_SUBSYSTEM_WINDOWS_CUI           = 3
    IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE = 0x0040
    IMAGE_DLLCHARACTERISTICS_NX_COMPAT    = 0x0100
)
const (
    // TODO: the Microsoft doco says IMAGE_SYM_DTYPE_ARRAY is 3 and IMAGE_SYM_DTYPE_FUNCTION is 2
    IMAGE_SYM_TYPE_NULL      = 0
    IMAGE_SYM_TYPE_STRUCT    = 8
    IMAGE_SYM_DTYPE_FUNCTION = 0x20
    IMAGE_SYM_DTYPE_ARRAY    = 0x30
    IMAGE_SYM_CLASS_EXTERNAL = 2
    IMAGE_SYM_CLASS_STATIC   = 3

    IMAGE_REL_I386_DIR32  = 0x0006
    IMAGE_REL_I386_SECREL = 0x000B
    IMAGE_REL_I386_REL32  = 0x0014

    IMAGE_REL_AMD64_ADDR64 = 0x0001
    IMAGE_REL_AMD64_ADDR32 = 0x0002
    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_BASED_HIGHLOW = 3
)

TODO(crawshaw): add these constants to debug/pe.

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
    XCOFFSECTALIGN  int64 = 32 // base on dump -o

    // 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 a unreachable
    // segment during execution to force segfault if something is wrong.
    XCOFFTEXTBASE = 0x100000000 // Start of text address
    XCOFFDATABASE = 0x200000000 // Start of data address
)
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 // DWARF info section
    SSUBTYP_DWLINE  = 0x20000 // DWARF line-number section
    SSUBTYP_DWPBNMS = 0x30000 // DWARF public names section
    SSUBTYP_DWPBTYP = 0x40000 // DWARF public types section
    SSUBTYP_DWARNGE = 0x50000 // DWARF aranges section
    SSUBTYP_DWABREV = 0x60000 // DWARF abbreviation section
    SSUBTYP_DWSTR   = 0x70000 // DWARF strings section
    SSUBTYP_DWRNGES = 0x80000 // DWARF ranges section
    SSUBTYP_DWLOC   = 0x90000 // DWARF location lists section
    SSUBTYP_DWFRAME = 0xA0000 // DWARF frames section
    SSUBTYP_DWMAC   = 0xB0000 // DWARF macros section
)
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 // is function
)
const (
    C_NULL    = 0   // Symbol table entry marked for deletion
    C_EXT     = 2   // External symbol
    C_STAT    = 3   // Static symbol
    C_BLOCK   = 100 // Beginning or end of inner block
    C_FCN     = 101 // Beginning or end of function
    C_FILE    = 103 // Source file name and compiler information
    C_HIDEXT  = 107 // Unnamed external symbol
    C_BINCL   = 108 // Beginning of include file
    C_EINCL   = 109 // End of include file
    C_WEAKEXT = 111 // Weak external symbol
    C_DWARF   = 112 // DWARF symbol
    C_GSYM    = 128 // Global variable
    C_LSYM    = 129 // Automatic variable allocated on stack
    C_PSYM    = 130 // Argument to subroutine allocated on stack
    C_RSYM    = 131 // Register variable
    C_RPSYM   = 132 // Argument to function or procedure stored in register
    C_STSYM   = 133 // Statically allocated symbol
    C_BCOMM   = 135 // Beginning of common block
    C_ECOML   = 136 // Local member of common block
    C_ECOMM   = 137 // End of common block
    C_DECL    = 140 // Declaration of object
    C_ENTRY   = 141 // Alternate entry
    C_FUN     = 142 // Function or procedure
    C_BSTAT   = 143 // Beginning of static block
    C_ESTAT   = 144 // End of static block
    C_GTLS    = 145 // Global thread-local variable
    C_STTLS   = 146 // Static thread-local variable
)

Storage Class.

const (
    XFT_FN = 0   // Source File Name
    XFT_CT = 1   // Compile Time Stamp
    XFT_CV = 2   // Compiler Version Number
    XFT_CD = 128 // Compiler Defined Information/

)

Xftype field

const (
    XTY_ER  = 0    // External reference
    XTY_SD  = 1    // Section definition
    XTY_LD  = 2    // Label definition
    XTY_CM  = 3    // Common csect definition
    XTY_WK  = 0x8  // Weak symbol
    XTY_EXP = 0x10 // Exported symbol
    XTY_ENT = 0x20 // Entry point symbol
    XTY_IMP = 0x40 // Imported symbol
)

Symbol type field.

const (
    XMC_PR     = 0  // Program code
    XMC_RO     = 1  // Read-only constant
    XMC_DB     = 2  // Debug dictionary table
    XMC_TC     = 3  // TOC entry
    XMC_UA     = 4  // Unclassified
    XMC_RW     = 5  // Read/Write data
    XMC_GL     = 6  // Global linkage
    XMC_XO     = 7  // Extended operation
    XMC_SV     = 8  // 32-bit supervisor call descriptor
    XMC_BS     = 9  // BSS class
    XMC_DS     = 10 // Function descriptor
    XMC_UC     = 11 // Unnamed FORTRAN common
    XMC_TC0    = 15 // TOC anchor
    XMC_TD     = 16 // Scalar data entry in the TOC
    XMC_SV64   = 17 // 64-bit supervisor call descriptor
    XMC_SV3264 = 18 // Supervisor call descriptor for both 32-bit and 64-bit
    XMC_TL     = 20 // Read/Write thread-local data
    XMC_UL     = 21 // Read/Write thread-local data (.tbss)
    XMC_TE     = 22 // TOC entry
)

Storage-mapping class.

const (
    XCOFF_R_POS = 0x00 // A(sym) Positive Relocation
    XCOFF_R_NEG = 0x01 // -A(sym) Negative Relocation
    XCOFF_R_REL = 0x02 // A(sym-*) Relative to self
    XCOFF_R_TOC = 0x03 // A(sym-TOC) Relative to TOC
    XCOFF_R_TRL = 0x12 // A(sym-TOC) TOC Relative indirect load.

    XCOFF_R_TRLA = 0x13 // A(sym-TOC) TOC Rel load address. modifiable inst
    XCOFF_R_GL   = 0x05 // A(external TOC of sym) Global Linkage
    XCOFF_R_TCL  = 0x06 // A(local TOC of sym) Local object TOC address
    XCOFF_R_RL   = 0x0C // A(sym) Pos indirect load. modifiable instruction
    XCOFF_R_RLA  = 0x0D // A(sym) Pos Load Address. modifiable instruction
    XCOFF_R_REF  = 0x0F // AL0(sym) Non relocating ref. No garbage collect
    XCOFF_R_BA   = 0x08 // A(sym) Branch absolute. Cannot modify instruction
    XCOFF_R_RBA  = 0x18 // A(sym) Branch absolute. modifiable instruction
    XCOFF_R_BR   = 0x0A // A(sym-*) Branch rel to self. non modifiable
    XCOFF_R_RBR  = 0x1A // A(sym-*) Branch rel to self. modifiable instr

    XCOFF_R_TLS    = 0x20 // General-dynamic reference to TLS symbol
    XCOFF_R_TLS_IE = 0x21 // Initial-exec reference to TLS symbol
    XCOFF_R_TLS_LD = 0x22 // Local-dynamic reference to TLS symbol
    XCOFF_R_TLS_LE = 0x23 // Local-exec reference to TLS symbol
    XCOFF_R_TLSM   = 0x24 // Module reference to TLS symbol
    XCOFF_R_TLSML  = 0x25 // Module reference to local (own) module

    XCOFF_R_TOCU = 0x30 // Relative to TOC - high order bits
    XCOFF_R_TOCL = 0x31 // Relative to TOC - low order bits
)
const (
    ARMAG = "!<arch>\n"
)
const (
    ARM_MAGIC_TRAMP_NUMBER = 0x5c000003
)

* Relocation types.

const (
    COMPUNITHEADERSIZE = 4 + 2 + 4 + 1
)

* Walk DWarfDebugInfoEntries, and emit .debug_info

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 (
    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 // minimum size for a function
)
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 (
    PEBASE = 0x00400000
)
const SYMESZ = 18
const (
    U64_TOCMAGIC = 0767 // AIX 64-bit XCOFF
)

Variables

var (
    Lcsize int32

    Spsize  int32
    Symsize int32
)
var (
    Funcalign int

    HEADR int32
)
var (
    Segtext      sym.Segment
    Segrodata    sym.Segment
    Segrelrodata sym.Segment
    Segdata      sym.Segment
    Segdwarf     sym.Segment
)
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")
    Flag8 bool // use 64-bit addresses in symbol table

    FlagDebugTramp = flag.Int("debugtramp", 0, "debug trampolines")
    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 text segment `address`")
)

Flags used by the linker. The exported flags are used by the architecture-specific packages.

var (
    // 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
)
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
)

func Adddynsym

func Adddynsym(ctxt *Link, s *sym.Symbol)

func Addstring

func Addstring(s *sym.Symbol, str string) int64

func Asmbelf

func Asmbelf(ctxt *Link, symo int64)

func Asmbelfsetup

func Asmbelfsetup()

func Asmbmacho

func Asmbmacho(ctxt *Link)

func Asmbpe

func Asmbpe(ctxt *Link)

func Asmbxcoff

func Asmbxcoff(ctxt *Link, fileoff int64)

Generate XCOFF assembly file

func Asmelfsym

func Asmelfsym(ctxt *Link)

func Asmplan9sym

func Asmplan9sym(ctxt *Link)

func AtExit

func AtExit(f func())

func Codeblk

func Codeblk(ctxt *Link, addr int64, size int64)

func CodeblkPad

func CodeblkPad(ctxt *Link, addr int64, size int64, pad []byte)

func Cputime

func Cputime() float64

TODO(josharian): delete. See issue 19865.

func Datblk

func Datblk(ctxt *Link, addr int64, size int64)

func DatblkBytes

func DatblkBytes(ctxt *Link, addr int64, size int64) []byte

Used only on Wasm for now.

func Domacholink(ctxt *Link) int64

func Dwarfblk

func Dwarfblk(ctxt *Link, addr int64, size int64)

func ELF32_R_INFO

func ELF32_R_INFO(sym uint32, type_ uint32) uint32

func ELF32_R_SYM

func ELF32_R_SYM(info uint32) uint32

func ELF32_R_TYPE

func ELF32_R_TYPE(info uint32) uint32

func ELF32_ST_BIND

func ELF32_ST_BIND(info uint8) uint8

func ELF32_ST_INFO

func ELF32_ST_INFO(bind uint8, type_ uint8) uint8

func ELF32_ST_TYPE

func ELF32_ST_TYPE(info uint8) uint8

func ELF32_ST_VISIBILITY

func ELF32_ST_VISIBILITY(oth uint8) uint8

func ELF64_R_INFO

func ELF64_R_INFO(sym uint32, type_ uint32) uint64

func ELF64_R_SYM

func ELF64_R_SYM(info uint64) uint32

func ELF64_R_TYPE

func ELF64_R_TYPE(info uint64) uint32

func ELF64_ST_BIND

func ELF64_ST_BIND(info uint8) uint8

func ELF64_ST_INFO

func ELF64_ST_INFO(bind uint8, type_ uint8) uint8

func ELF64_ST_TYPE

func ELF64_ST_TYPE(info uint8) uint8

func ELF64_ST_VISIBILITY

func ELF64_ST_VISIBILITY(oth uint8) uint8

func Elfemitreloc

func Elfemitreloc(ctxt *Link)

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 Elfwritedynent(ctxt *Link, s *sym.Symbol, tag int, val uint64)

func Elfwritedynentsymplus

func Elfwritedynentsymplus(ctxt *Link, s *sym.Symbol, tag int, t *sym.Symbol, add int64)

func Entryvalue

func Entryvalue(ctxt *Link) int64

func Errorf

func Errorf(s *sym.Symbol, format string, args ...interface{})

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.

func Exit

func Exit(code int)

Exit exits with code after executing all atExitFuncs.

func Exitf

func Exitf(format string, a ...interface{})

Exitf logs an error message then calls Exit(2).

func Lflag

func Lflag(ctxt *Link, arg string)

func Loaderblk

func Loaderblk(ctxt *Link, off uint64)

Create loader section and returns its size

func Machoemitreloc

func Machoemitreloc(ctxt *Link)

func Main

func Main(arch *sys.Arch, theArch Arch)

Main is the main entry point for the linker code.

func Peinit

func Peinit(ctxt *Link)

func Rnd

func Rnd(v int64, r int64) int64

func Symaddr

func Symaddr(s *sym.Symbol) int64

func Xcoffadddynrel

func Xcoffadddynrel(ctxt *Link, s *sym.Symbol, r *sym.Reloc) bool

Xcoffadddynrel adds a dynamic relocation in a XCOFF file. This relocation will be made by the loader.

func Xcoffinit

func Xcoffinit(ctxt *Link)

Xcoffinit initialised some internal value and setups already known header information

type ArHdr

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

type Arch

type Arch struct {
    Funcalign      int
    Maxalign       int
    Minalign       int
    Dwarfregsp     int
    Dwarfreglr     int
    Linuxdynld     string
    Freebsddynld   string
    Netbsddynld    string
    Openbsddynld   string
    Dragonflydynld string
    Solarisdynld   string
    Adddynrel      func(*Link, *sym.Symbol, *sym.Reloc) 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) and a boolean indicating
    // success/failure (a failing value indicates a fatal error).
    Archreloc func(link *Link, rel *sym.Reloc, sym *sym.Symbol,
        offset int64) (relocatedOffset int64, success 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(link *Link, rel *sym.Reloc, sym *sym.Symbol,
        offset int64) (relocatedOffset int64)
    Trampoline func(*Link, *sym.Reloc, *sym.Symbol)

    // Asmb and Asmb2 are arch-specific routines that write the output
    // file. Typically, Asmb writes most of the content (sections and
    // segments), for which we have computed the size and offset. Asmb2
    // writes the rest.
    Asmb  func(*Link)
    Asmb2 func(*Link)

    Elfreloc1   func(*Link, *sym.Reloc, int64) bool
    Elfsetupplt func(*Link)
    Gentext     func(*Link)
    Machoreloc1 func(*sys.Arch, *OutBuf, *sym.Symbol, *sym.Reloc, int64) bool
    PEreloc1    func(*sys.Arch, *OutBuf, *sym.Symbol, *sym.Reloc, int64) bool
    Xcoffreloc1 func(*sys.Arch, *OutBuf, *sym.Symbol, *sym.Reloc, int64) bool

    // 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(s *sym.Symbol, off, size int)

    // optional override for assignAddress
    AssignAddress func(ctxt *Link, sect *sym.Section, n int, s *sym.Symbol, va uint64, isTramp bool) (*sym.Section, int, uint64)
}

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'.

const (
    BuildModeUnset BuildMode = iota
    BuildModeExe
    BuildModePIE
    BuildModeCArchive
    BuildModeCShared
    BuildModeShared
    BuildModePlugin
)

func (*BuildMode) Set

func (mode *BuildMode) Set(s string) error

func (*BuildMode) String

func (mode *BuildMode) String() string

type Dll

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

type ElfEhdr

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

* ELF header.

type ElfPhdr

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

* Program header.

type ElfShdr

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

* Section header.

type Elfaux

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

type Elflib

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

type Elfstring

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

type GCProg

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

func (*GCProg) AddSym

func (p *GCProg) AddSym(s *sym.Symbol)

func (*GCProg) End

func (p *GCProg) End(size int64)

func (*GCProg) Init

func (p *GCProg) Init(ctxt *Link, name string)

type Hostobj

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

type IMAGE_EXPORT_DIRECTORY

type IMAGE_EXPORT_DIRECTORY struct {
    Characteristics       uint32
    TimeDateStamp         uint32
    MajorVersion          uint16
    MinorVersion          uint16
    Name                  uint32
    Base                  uint32
    NumberOfFunctions     uint32
    NumberOfNames         uint32
    AddressOfFunctions    uint32
    AddressOfNames        uint32
    AddressOfNameOrdinals uint32
}

type IMAGE_IMPORT_DESCRIPTOR

type IMAGE_IMPORT_DESCRIPTOR struct {
    OriginalFirstThunk uint32
    TimeDateStamp      uint32
    ForwarderChain     uint32
    Name               uint32
    FirstThunk         uint32
}

type Imp

type Imp struct {
    // contains filtered or unexported fields
}
type Link struct {
    Out *OutBuf

    Syms *sym.Symbols

    Arch      *sys.Arch
    Debugvlog int
    Bso       *bufio.Writer

    Loaded bool // set after all inputs have been loaded as symbols

    IsELF    bool
    HeadType objabi.HeadType

    LinkMode  LinkMode
    BuildMode BuildMode

    Tlsg         *sym.Symbol
    Libdir       []string
    Library      []*sym.Library
    LibraryByPkg map[string]*sym.Library
    Shlibs       []Shlib
    Tlsoffset    int
    Textp        []*sym.Symbol
    Filesyms     []*sym.Symbol
    Moduledata   *sym.Symbol

    PackageFile  map[string]string
    PackageShlib map[string]string

    // Used to implement field tracking.
    Reachparent map[*sym.Symbol]*sym.Symbol
    // 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 *sym.Symbol)

add a trampoline with symbol s (to be laid down after the current function)

func (*Link) CanUsePlugins

func (ctxt *Link) CanUsePlugins() bool

CanUsePlugins reports whether a plugins can be used

func (*Link) DynlinkingGo

func (ctxt *Link) DynlinkingGo() bool

DynlinkingGo reports whether we are producing Go code that can live in separate shared libraries linked together at runtime.

func (*Link) ErrorUnresolved

func (ctxt *Link) ErrorUnresolved(s *sym.Symbol, r *sym.Reloc)

ErrorUnresolved prints unresolved symbol error for r.Sym that is referenced from s.

func (*Link) FixedFrameSize

func (ctxt *Link) FixedFrameSize() int64

The smallest possible offset from the hardware stack pointer to a local variable on the stack. Architectures that use a link register save its value on the stack in the function prologue and so always have a pointer between the hardware stack pointer and the local variable area.

func (*Link) Logf

func (ctxt *Link) Logf(format string, args ...interface{})

func (*Link) UseRelro

func (ctxt *Link) UseRelro() bool

UseRelro reports whether to make use of "read only relocations" aka relro.

type LinkMode

type LinkMode uint8

LinkMode indicates whether an external linker is used for the final link.

const (
    LinkAuto LinkMode = iota
    LinkInternal
    LinkExternal
)

func (*LinkMode) Set

func (mode *LinkMode) Set(s string) error

func (*LinkMode) String

func (mode *LinkMode) String() string

type MachoHdr

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

type MachoLoad

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

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 MachoSect

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

type MachoSeg

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

type OutBuf

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

OutBuf is a buffered file writer.

It is simlar 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.

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 - Munmap the output file - possibly write more content to the file, which will not be edited later.

func (*OutBuf) Flush

func (out *OutBuf) Flush()

func (*OutBuf) Mmap

func (out *OutBuf) Mmap(filesize uint64) error

func (*OutBuf) Msync

func (out *OutBuf) Msync() error

func (*OutBuf) Munmap

func (out *OutBuf) Munmap()

func (*OutBuf) Offset

func (out *OutBuf) Offset() int64

func (*OutBuf) SeekSet

func (out *OutBuf) SeekSet(p int64)

func (*OutBuf) Write

func (out *OutBuf) Write(v []byte) (int, error)

Write writes the contents of v to the buffer.

As Write is backed by a bufio.Writer, callers do not have to explicitly handle the returned error as long as Flush is eventually called.

func (*OutBuf) Write16

func (out *OutBuf) Write16(v uint16)

func (*OutBuf) Write32

func (out *OutBuf) Write32(v uint32)

func (*OutBuf) Write32b

func (out *OutBuf) Write32b(v uint32)

func (*OutBuf) Write64

func (out *OutBuf) Write64(v uint64)

func (*OutBuf) Write64b

func (out *OutBuf) Write64b(v uint64)

func (*OutBuf) Write8

func (out *OutBuf) Write8(v uint8)

func (*OutBuf) WriteByte

func (out *OutBuf) WriteByte(v byte) error

WriteByte is an alias for Write8 to fulfill the io.ByteWriter interface.

func (*OutBuf) WriteString

func (out *OutBuf) WriteString(s string)

func (*OutBuf) WriteStringN

func (out *OutBuf) WriteStringN(s string, n int)

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

func (out *OutBuf) WriteStringPad(s string, n int, pad []byte)

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).

func (*OutBuf) WriteSym

func (out *OutBuf) WriteSym(s *sym.Symbol)

WriteSym writes the content of a Symbol, then changes the Symbol's content to point to the output buffer that we just wrote, so we can apply further edit to the symbol content. If the output file is not Mmap'd, just writes the content.

type PCIter

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

PCIter iterates over encoded pcdata tables.

type Pkg

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

type Rpath

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

func (*Rpath) Set

func (r *Rpath) Set(val string) error

func (*Rpath) String

func (r *Rpath) String() string

type Shlib

type Shlib struct {
    Path string
    Hash []byte
    Deps []string
    File *elf.File
    // contains filtered or unexported fields
}

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 XcoffAoutHdr64

type XcoffAoutHdr64 struct {
    Omagic      int16    // Flags - Ignored If Vstamp Is 1
    Ovstamp     int16    // Version
    Odebugger   uint32   // Reserved For Debugger
    Otextstart  uint64   // Virtual Address Of Text
    Odatastart  uint64   // Virtual Address Of Data
    Otoc        uint64   // Toc Address
    Osnentry    int16    // Section Number For Entry Point
    Osntext     int16    // Section Number For Text
    Osndata     int16    // Section Number For Data
    Osntoc      int16    // Section Number For Toc
    Osnloader   int16    // Section Number For Loader
    Osnbss      int16    // Section Number For Bss
    Oalgntext   int16    // Max Text Alignment
    Oalgndata   int16    // Max Data Alignment
    Omodtype    [2]byte  // Module Type Field
    Ocpuflag    uint8    // Bit Flags - Cputypes Of Objects
    Ocputype    uint8    // Reserved for CPU type
    Otextpsize  uint8    // Requested text page size
    Odatapsize  uint8    // Requested data page size
    Ostackpsize uint8    // Requested stack page size
    Oflags      uint8    // Flags And TLS Alignment
    Otsize      uint64   // Text Size In Bytes
    Odsize      uint64   // Data Size In Bytes
    Obsize      uint64   // Bss Size In Bytes
    Oentry      uint64   // Entry Point Address
    Omaxstack   uint64   // Max Stack Size Allowed
    Omaxdata    uint64   // Max Data Size Allowed
    Osntdata    int16    // Section Number For Tdata Section
    Osntbss     int16    // Section Number For Tbss Section
    Ox64flags   uint16   // Additional Flags For 64-Bit Objects
    Oresv3a     int16    // Reserved
    Oresv3      [2]int32 // Reserved
}

Auxiliary Header

type XcoffAuxCSect64

type XcoffAuxCSect64 struct {
    Xscnlenlo uint32 // Lower 4 bytes of length or symbol table index
    Xparmhash uint32 // Offset of parameter type-check string
    Xsnhash   uint16 // .typchk section number
    Xsmtyp    uint8  // Symbol alignment and type
    Xsmclas   uint8  // Storage-mapping class
    Xscnlenhi uint32 // Upper 4 bytes of length or symbol table index
    Xpad      uint8  // Unused
    Xauxtype  uint8  // Type of auxiliary entry
}

csect Auxiliary Entry.

type XcoffAuxDWARF64

type XcoffAuxDWARF64 struct {
    Xscnlen  uint64 // Length of this symbol section
    X_pad    [9]byte
    Xauxtype uint8 // Type of auxiliary entry
}

DWARF Auxiliary Entry

type XcoffAuxFcn64

type XcoffAuxFcn64 struct {
    Xlnnoptr uint64 // File pointer to line number
    Xfsize   uint32 // Size of function in bytes
    Xendndx  uint32 // Symbol table index of next entry
    Xpad     uint8  // Unused
    Xauxtype uint8  // Type of auxiliary entry
}

Function Auxiliary Entry

type XcoffAuxFile64

type XcoffAuxFile64 struct {
    Xzeroes  uint32 // The name is always in the string table
    Xoffset  uint32 // Offset in the string table
    X_pad1   [6]byte
    Xftype   uint8 // Source file string type
    X_pad2   [2]byte
    Xauxtype uint8 // Type of auxiliary entry
}

File Auxiliary Entry

type XcoffFileHdr64

type XcoffFileHdr64 struct {
    Fmagic   uint16 // Target machine
    Fnscns   uint16 // Number of sections
    Ftimedat int32  // Time and date of file creation
    Fsymptr  uint64 // Byte offset to symbol table start
    Fopthdr  uint16 // Number of bytes in optional header
    Fflags   uint16 // Flags
    Fnsyms   int32  // Number of entries in symbol table
}

File Header

type XcoffLdHdr64

type XcoffLdHdr64 struct {
    Lversion int32  // Loader section version number
    Lnsyms   int32  // Number of symbol table entries
    Lnreloc  int32  // Number of relocation table entries
    Listlen  uint32 // Length of import file ID string table
    Lnimpid  int32  // Number of import file IDs
    Lstlen   uint32 // Length of string table
    Limpoff  uint64 // Offset to start of import file IDs
    Lstoff   uint64 // Offset to start of string table
    Lsymoff  uint64 // Offset to start of symbol table
    Lrldoff  uint64 // Offset to start of relocation entries
}

Loader Header

type XcoffLdImportFile64

type XcoffLdImportFile64 struct {
    Limpidpath string
    Limpidbase string
    Limpidmem  string
}

type XcoffLdRel64

type XcoffLdRel64 struct {
    Lvaddr  uint64 // Address Field
    Lrtype  uint16 // Relocation Size and Type
    Lrsecnm int16  // Section Number being relocated
    Lsymndx int32  // Loader-Section symbol table index
}

type XcoffLdStr64

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

type XcoffLdSym64

type XcoffLdSym64 struct {
    Lvalue  uint64 // Address field
    Loffset uint32 // Byte offset into string table of symbol name
    Lscnum  int16  // Section number containing symbol
    Lsmtype int8   // Symbol type, export, import flags
    Lsmclas int8   // Symbol storage class
    Lifile  int32  // Import file ID; ordinal of import file IDs
    Lparm   uint32 // Parameter type-check field
}

Loader Symbol

type XcoffScnHdr64

type XcoffScnHdr64 struct {
    Sname    [8]byte // Section Name
    Spaddr   uint64  // Physical Address
    Svaddr   uint64  // Virtual Address
    Ssize    uint64  // Section Size
    Sscnptr  uint64  // File Offset To Raw Data
    Srelptr  uint64  // File Offset To Relocation
    Slnnoptr uint64  // File Offset To Line Numbers
    Snreloc  uint32  // Number Of Relocation Entries
    Snlnno   uint32  // Number Of Line Number Entries
    Sflags   uint32  // flags
}

Section Header

type XcoffSymEnt64

type XcoffSymEnt64 struct {
    Nvalue  uint64 // Symbol value
    Noffset uint32 // Offset of the name in string table or .debug section
    Nscnum  int16  // Section number of symbol
    Ntype   uint16 // Basic and derived type specification
    Nsclass uint8  // Storage class of symbol
    Nnumaux int8   // Number of auxiliary entries
}

Symbol Table Entry