...

Package loadelf

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

Overview ▾

Package loadelf implements an ELF file reader.

Constants

const (
    ElfClassNone = 0
    ElfClass32   = 1
    ElfClass64   = 2
)

Derived from Plan 9 from User Space's src/libmach/elf.h, elf.c http://code.swtch.com/plan9port/src/tip/src/libmach/

Copyright © 2004 Russ Cox.
Portions Copyright © 2008-2010 Google Inc.
Portions Copyright © 2010 The Go Authors.

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

const (
    ElfDataNone = 0
    ElfDataLsb  = 1
    ElfDataMsb  = 2
)
const (
    ElfTypeNone         = 0
    ElfTypeRelocatable  = 1
    ElfTypeExecutable   = 2
    ElfTypeSharedObject = 3
    ElfTypeCore         = 4
)
const (
    ElfMachNone        = 0
    ElfMach32100       = 1
    ElfMachSparc       = 2
    ElfMach386         = 3
    ElfMach68000       = 4
    ElfMach88000       = 5
    ElfMach486         = 6
    ElfMach860         = 7
    ElfMachMips        = 8
    ElfMachS370        = 9
    ElfMachMipsLe      = 10
    ElfMachParisc      = 15
    ElfMachVpp500      = 17
    ElfMachSparc32Plus = 18
    ElfMach960         = 19
    ElfMachPower       = 20
    ElfMachPower64     = 21
    ElfMachS390        = 22
    ElfMachV800        = 36
    ElfMachFr20        = 37
    ElfMachRh32        = 38
    ElfMachRce         = 39
    ElfMachArm         = 40
    ElfMachAlpha       = 41
    ElfMachSH          = 42
    ElfMachSparc9      = 43
    ElfMachAmd64       = 62
    ElfMachArm64       = 183
)
const (
    ElfAbiNone     = 0
    ElfAbiSystemV  = 0
    ElfAbiHPUX     = 1
    ElfAbiNetBSD   = 2
    ElfAbiLinux    = 3
    ElfAbiSolaris  = 6
    ElfAbiAix      = 7
    ElfAbiIrix     = 8
    ElfAbiFreeBSD  = 9
    ElfAbiTru64    = 10
    ElfAbiModesto  = 11
    ElfAbiOpenBSD  = 12
    ElfAbiARM      = 97
    ElfAbiEmbedded = 255
)
const (
    ElfSectNone      = 0
    ElfSectProgbits  = 1
    ElfSectSymtab    = 2
    ElfSectStrtab    = 3
    ElfSectRela      = 4
    ElfSectHash      = 5
    ElfSectDynamic   = 6
    ElfSectNote      = 7
    ElfSectNobits    = 8
    ElfSectRel       = 9
    ElfSectShlib     = 10
    ElfSectDynsym    = 11
    ElfSectFlagWrite = 0x1
    ElfSectFlagAlloc = 0x2
    ElfSectFlagExec  = 0x4
)
const (
    ElfSymBindLocal  = 0
    ElfSymBindGlobal = 1
    ElfSymBindWeak   = 2
)
const (
    ElfSymTypeNone    = 0
    ElfSymTypeObject  = 1
    ElfSymTypeFunc    = 2
    ElfSymTypeSection = 3
    ElfSymTypeFile    = 4
    ElfSymTypeCommon  = 5
    ElfSymTypeTLS     = 6
)
const (
    ElfSymShnNone   = 0
    ElfSymShnAbs    = 0xFFF1
    ElfSymShnCommon = 0xFFF2
)
const (
    ElfProgNone      = 0
    ElfProgLoad      = 1
    ElfProgDynamic   = 2
    ElfProgInterp    = 3
    ElfProgNote      = 4
    ElfProgShlib     = 5
    ElfProgPhdr      = 6
    ElfProgFlagExec  = 0x1
    ElfProgFlagWrite = 0x2
    ElfProgFlagRead  = 0x4
)
const (
    ElfNotePrStatus     = 1
    ElfNotePrFpreg      = 2
    ElfNotePrPsinfo     = 3
    ElfNotePrTaskstruct = 4
    ElfNotePrAuxv       = 6
    ElfNotePrXfpreg     = 0x46e62b7f
)
const (
    ELF64SYMSIZE = 24
    ELF32SYMSIZE = 16

    SHT_ARM_ATTRIBUTES = 0x70000003
)

TODO(crawshaw): de-duplicate with cmd/link/internal/ld/elf.go.

const (
    TagFile               = 1
    TagCPUName            = 4
    TagCPURawName         = 5
    TagCompatibility      = 32
    TagNoDefaults         = 64
    TagAlsoCompatibleWith = 65
    TagABIVFPArgs         = 28
)

Variables

var ElfMagic = [4]uint8{0x7F, 'E', 'L', 'F'}

func Load

func Load(arch *sys.Arch, syms *sym.Symbols, f *bio.Reader, pkg string, length int64, pn string, initEhdrFlags uint32) (textp []*sym.Symbol, ehdrFlags uint32, err error)

Load loads the ELF file pn from f. Symbols are written into syms, and a slice of the text symbols is returned.

On ARM systems, Load will attempt to determine what ELF header flags to emit by scanning the attributes in the ELF file being loaded. The parameter initEhdrFlags contains the current header flags for the output object, and the returned ehdrFlags contains what this Load function computes. TODO: find a better place for this logic.

type ElfHdrBytes

type ElfHdrBytes struct {
    Ident     [16]uint8
    Type      [2]uint8
    Machine   [2]uint8
    Version   [4]uint8
    Entry     [4]uint8
    Phoff     [4]uint8
    Shoff     [4]uint8
    Flags     [4]uint8
    Ehsize    [2]uint8
    Phentsize [2]uint8
    Phnum     [2]uint8
    Shentsize [2]uint8
    Shnum     [2]uint8
    Shstrndx  [2]uint8
}

type ElfHdrBytes64

type ElfHdrBytes64 struct {
    Ident     [16]uint8
    Type      [2]uint8
    Machine   [2]uint8
    Version   [4]uint8
    Entry     [8]uint8
    Phoff     [8]uint8
    Shoff     [8]uint8
    Flags     [4]uint8
    Ehsize    [2]uint8
    Phentsize [2]uint8
    Phnum     [2]uint8
    Shentsize [2]uint8
    Shnum     [2]uint8
    Shstrndx  [2]uint8
}

type ElfObj

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

type ElfProgBytes

type ElfProgBytes struct {
}

type ElfProgBytes64

type ElfProgBytes64 struct {
}

type ElfSect

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

type ElfSectBytes

type ElfSectBytes struct {
    Name    [4]uint8
    Type    [4]uint8
    Flags   [4]uint8
    Addr    [4]uint8
    Off     [4]uint8
    Size    [4]uint8
    Link    [4]uint8
    Info    [4]uint8
    Align   [4]uint8
    Entsize [4]uint8
}

type ElfSectBytes64

type ElfSectBytes64 struct {
    Name    [4]uint8
    Type    [4]uint8
    Flags   [8]uint8
    Addr    [8]uint8
    Off     [8]uint8
    Size    [8]uint8
    Link    [4]uint8
    Info    [4]uint8
    Align   [8]uint8
    Entsize [8]uint8
}

type ElfSym

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

type ElfSymBytes

type ElfSymBytes struct {
    Name  [4]uint8
    Value [4]uint8
    Size  [4]uint8
    Info  uint8
    Other uint8
    Shndx [2]uint8
}

type ElfSymBytes64

type ElfSymBytes64 struct {
    Name  [4]uint8
    Info  uint8
    Other uint8
    Shndx [2]uint8
    Value [8]uint8
    Size  [8]uint8
}