liblink

package
v0.0.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 27, 2018 License: BSD-3-Clause Imports: 13 Imported by: 0

Documentation

Index

Constants

View Source
const (
	OREAD = iota
	OWRITE
	ORDWR
	SIGBUS
	SIGSEGV
	NDFLT
	FPPDBL
	FPRNR
	BOM
	HEADER_IO
)
View Source
const (
	Sxxx = iota
	STEXT
	SELFRXSECT
	STYPE
	SSTRING
	SGOSTRING
	SGOFUNC
	SRODATA
	SFUNCTAB
	STYPELINK
	SSYMTAB
	SPCLNTAB
	SELFROSECT
	SMACHOPLT
	SELFSECT
	SMACHO
	SMACHOGOT
	SNOPTRDATA
	SINITARR
	SDATA
	SWINDOWS
	SBSS
	SNOPTRBSS
	STLSBSS
	SXREF
	SMACHOSYMSTR
	SMACHOSYMTAB
	SMACHOINDIRECTPLT
	SMACHOINDIRECTGOT
	SFILE
	SFILEPATH
	SCONST
	SDYNIMPORT
	SHOSTOBJ
	SSUB    = 1 << 8
	SMASK   = SSUB - 1
	SHIDDEN = 1 << 9
)

LSym.type

View Source
const (
	R_ADDR = 1 + iota
	R_SIZE
	R_CALL
	R_CALLARM
	R_CALLIND
	R_CONST
	R_PCREL
	R_TLS
	R_TLS_LE
	R_TLS_IE
	R_GOTOFF
	R_PLT0
	R_PLT1
	R_PLT2
	R_USEFIELD
)

Reloc.type

View Source
const (
	A_AUTO = 1 + iota
	A_PARAM
)

Auto.type

View Source
const (
	Hunknown = 0 + iota
	Hdarwin
	Hdragonfly
	Helf
	Hfreebsd
	Hlinux
	Hnacl
	Hnetbsd
	Hopenbsd
	Hplan9
	Hsolaris
	Hwindows
)

executable header types

View Source
const (
	LinkAuto = 0 + iota
	LinkInternal
	LinkExternal
)
View Source
const (
	HISTSZ = 10
	NSYM   = 50
)

Copyright 2009 The Go Authors. All rights reserved. Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.

View Source
const (
	StackSystem        = 0
	StackExtra         = 2048
	StackMin           = 8192
	StackSystemRounded = StackSystem + (-StackSystem & (StackMin - 1))
	FixedStack         = StackMin + StackSystemRounded
	StackBig           = 4096
	StackGuard         = 256 + StackSystem
	StackSmall         = 128
	StackLimit         = StackGuard - StackSystem - StackSmall
	StackTop           = 88
)

Copyright 2011 The Go Authors. All rights reserved. Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.

Stack layout parameters. Included both by runtime (compiled via 6c) and linkers (compiled via gcc).

The per-goroutine g->stackguard is set to point StackGuard bytes above the bottom of the stack. Each function compares its stack pointer against g->stackguard to check for overflow. To cut one instruction from the check sequence for functions with tiny frames, the stack is allowed to protrude StackSmall bytes below the stack guard. Functions with large frames don't bother with the check and always call morestack. The sequences are (for amd64, others are similar):

guard = g->stackguard
frame = function's stack frame size
argsize = size of function arguments (call + return)

stack frame size <= StackSmall:
	CMPQ guard, SP
	JHI 3(PC)
	MOVQ m->morearg, $(argsize << 32)
	CALL morestack(SB)

stack frame size > StackSmall but < StackBig
	LEAQ (frame-StackSmall)(SP), R0
	CMPQ guard, R0
	JHI 3(PC)
	MOVQ m->morearg, $(argsize << 32)
	CALL morestack(SB)

stack frame size >= StackBig:
	MOVQ m->morearg, $((argsize << 32) | frame)
	CALL morestack(SB)

The bottom StackGuard - StackSmall bytes are important: there has to be enough room to execute functions that refuse to check for stack overflow, either because they need to be adjacent to the actual caller's frame (deferproc) or because they handle the imminent stack overflow (morestack).

For example, deferproc might call malloc, which does one of the above checks (without allocating a full frame), which might trigger a call to morestack. This sequence needs to fit in the bottom section of the stack. On amd64, morestack's frame is 40 bytes, and deferproc's frame is 56 bytes. That fits well within the StackGuard - StackSmall = 128 bytes at the bottom. The linkers explore all possible call traces involving non-splitting functions to make sure that this limit cannot be violated.

View Source
const (
	NOPROF   = 1
	DUPOK    = 2
	NOSPLIT  = 4
	RODATA   = 8
	NOPTR    = 16
	WRAPPER  = 32
	NEEDCTXT = 64
)

Copyright 2013 The Go Authors. All rights reserved. Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. This file defines flags attached to various functions and data objects. The compilers, assemblers, and linker must all agree on these values. Don't profile the marked routine. This flag is deprecated. It is ok for the linker to get multiple of these symbols. It will pick one of the duplicates to use. Don't insert stack check preamble. Put this data in a read-only section. This data contains no pointers. This is a wrapper function and should not count as disabling 'recover'. This function uses its incoming context register.

View Source
const (
	UTFmax    = 4
	Runesync  = 0x80
	Runeself  = 0x80
	Runeerror = 0xFFFD
	Runemax   = 0x10FFFF
)
View Source
const (
	NOPROF_textflag   = 1
	DUPOK_textflag    = 2
	NOSPLIT_textflag  = 4
	RODATA_textflag   = 8
	NOPTR_textflag    = 16
	WRAPPER_textflag  = 32
	NEEDCTXT_textflag = 64
)
View Source
const (
	AEXIST = 0
)
View Source
const (
	HistVersion = 1
)

symbol version, incremented each time a file is loaded. version==1 is reserved for savehist.

View Source
const (
	LINKHASH = 100003
)
View Source
const (
	LOG = 5
)
View Source
const (
	StackPreempt = -1314
)

Goroutine preemption request. Stored into g->stackguard0 to cause split stack check failure. Must be greater than any real sp. 0xfffffade in hex.

Variables

View Source
var GOEXPERIMENT string

Functions

func Adduint32

func Adduint32(ctxt *Link, s *LSym, v uint32) int64

func Adduint64

func Adduint64(ctxt *Link, s *LSym, v uint64) int64

func Bflush

func Bflush(b *Biobuf)

func Bgetc

func Bgetc(b *Biobuf) int

func Boffset

func Boffset(b *Biobuf) int64

func Bprint

func Bprint(b *Biobuf, format string, args ...interface{})

func Bputc

func Bputc(b *Biobuf, c int)

func Bread

func Bread(b *Biobuf, buf []byte) int

func Bungetc

func Bungetc(b *Biobuf)

func Bwrite

func Bwrite(b *Biobuf, buf []byte) int

func Cputime

func Cputime() float64

func Getgoarch

func Getgoarch() string

func Getgoarm

func Getgoarm() string

func Getgoos

func Getgoos() string

func Getgoroot

func Getgoroot() string

func Getgoversion

func Getgoversion() string

func Headstr

func Headstr(v int) string

func Symgrow

func Symgrow(ctxt *Link, s *LSym, lsiz int64)

func Writeobj

func Writeobj(ctxt *Link, b *Biobuf)

The Go and C compilers, and the assembler, call writeobj to write out a Go object file. The linker does not call this; the linker does not write out object files.

Types

type Addr

type Addr struct {
	Offset int64
	U      struct {
		Sval   string
		Dval   float64
		Branch *Prog
	}
	Sym     *LSym
	Gotype  *LSym
	Typ     int
	Index   int
	Scale   int8
	Reg     int
	Name    int
	Class   int
	Etype   uint8
	Offset2 int
	Node    *struct{}
	Width   int64
}

Derived from Inferno utils/6l/l.h and related files. http://code.google.com/p/inferno-os/source/browse/utils/6l/l.h

Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
Portions Copyright © 1997-1999 Vita Nuova Limited
Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com)
Portions Copyright © 2004,2006 Bruce Ellis
Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others
Portions Copyright © 2009 The Go Authors.  All rights reserved.

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.

type Auto

type Auto struct {
	Asym    *LSym
	Link    *Auto
	Aoffset int
	Typ     int
	Gotype  *LSym
}

type Biobuf

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

func Binitw

func Binitw(f io.Writer) *Biobuf

func (*Biobuf) Write

func (b *Biobuf) Write(buf []byte) (int, error)

type Hist

type Hist struct {
	Link   *Hist
	Name   string
	Line   int
	Offset int
}

type LSym

type LSym struct {
	Name        string
	Extname     string
	Typ         int
	Version     uint32
	Dupok       int
	External    uint8
	Nosplit     uint8
	Reachable   uint8
	Cgoexport   uint8
	Special     uint8
	Stkcheck    uint8
	Hide        uint8
	Leaf        uint8
	Fnptr       uint8
	Seenglobl   uint8
	Onlist      uint8
	Printed     uint8
	Symid       int16
	Dynid       int
	Sig         int
	Plt         int
	Got         int
	Align       int
	Elfsym      int
	Args        int
	Locals      int64
	Value       int64
	Size        int64
	Hash        *LSym
	Allsym      *LSym
	Next        *LSym
	Sub         *LSym
	Outer       *LSym
	Gotype      *LSym
	Reachparent *LSym
	Queue       *LSym
	File        string
	Dynimplib   string
	Dynimpvers  string
	Sect        *struct{}
	Autom       *Auto
	Text        *Prog
	Etext       *Prog
	Pcln        *Pcln
	P           []uint8
	R           []Reloc
}

func Linklookup

func Linklookup(ctxt *Link, name string, v uint32) *LSym

type Library

type Library struct {
	Objref string
	Srcref string
	File   string
	Pkg    string
}
type Link struct {
	Thechar        int
	Thestring      string
	Goarm          int
	Headtype       int
	Arch           *LinkArch
	Ignore         func(string) int
	Debugasm       int
	Debugline      int
	Debughist      int
	Debugread      int
	Debugvlog      int
	Debugstack     int
	Debugzerostack int
	Debugdivmod    int
	Debugfloat     int
	Debugpcln      int
	Flag_shared    int
	Iself          int
	Bso            *Biobuf
	Pathname       string
	Windows        int
	Trimpath       string
	Goroot         string
	Goroot_final   string
	Hash           [LINKHASH]*LSym
	Allsym         *LSym
	Nsymbol        int
	Hist           *Hist
	Ehist          *Hist
	Plist          *Plist
	Plast          *Plist
	Sym_div        *LSym
	Sym_divu       *LSym
	Sym_mod        *LSym
	Sym_modu       *LSym
	Symmorestack   [20]*LSym
	Tlsg           *LSym
	Plan9privates  *LSym
	Curp           *Prog
	Printp         *Prog
	Blitrl         *Prog
	Elitrl         *Prog
	Rexflag        int
	Rep            int
	Repn           int
	Lock           int
	Asmode         int
	Andptr         []uint8
	And            [100]uint8
	Instoffset     int
	Autosize       int
	Armsize        int
	Pc             int64
	Libdir         []string
	Library        []Library
	Tlsoffset      int
	Diag           func(string, ...interface{})
	Mode           int
	Curauto        *Auto
	Curhist        *Auto
	Cursym         *LSym
	Version        uint32
	Textp          *LSym
	Etextp         *LSym
	Histdepth      int
	Nhistfile      int
	Filesyms       *LSym
}

func Linknew

func Linknew(arch *LinkArch) *Link

func (*Link) Prg

func (ctxt *Link) Prg() *Prog

type LinkArch

type LinkArch struct {
	Name          string
	Thechar       int
	ByteOrder     binary.ByteOrder
	Pconv         func(*Prog) string
	Addstacksplit func(*Link, *LSym)
	Assemble      func(*Link, *LSym)
	Datasize      func(*Prog) int
	Follow        func(*Link, *LSym)
	Iscall        func(*Prog) int
	Isdata        func(*Prog) int
	Prg           func() *Prog
	Progedit      func(*Link, *Prog)
	Settextflag   func(*Prog, int)
	Symtype       func(*Addr) int
	Textflag      func(*Prog) int
	Minlc         uint32
	Ptrsize       int64
	Regsize       int
	D_ADDR        int
	D_AUTO        int
	D_BRANCH      int
	D_CONST       int
	D_EXTERN      int
	D_FCONST      int
	D_NONE        int
	D_PARAM       int
	D_SCONST      int
	D_STATIC      int
	ACALL         int
	ADATA         int
	AEND          int
	AFUNCDATA     int
	AGLOBL        int
	AJMP          int
	ANOP          int
	APCDATA       int
	ARET          int
	ATEXT         int
	ATYPE         int
	AUSEFIELD     int
}

type Pcdata

type Pcdata struct {
	P []uint8
}

type Pciter

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

type Pcln

type Pcln struct {
	Pcsp        Pcdata
	Pcfile      Pcdata
	Pcline      Pcdata
	Pcdata      []Pcdata
	Funcdata    []*LSym
	Funcdataoff []int64
	Nfuncdata   int
	File        []*LSym
	Lastfile    *LSym
	Lastindex   int
}

type Plist

type Plist struct {
	Name    *LSym
	Firstpc *Prog
	Recur   int
	Link    *Plist
}

func Linknewplist

func Linknewplist(ctxt *Link) *Plist

* start a new Prog list.

type Prog

type Prog struct {
	Ctxt     *Link
	Pc       int64
	Lineno   int
	Link     *Prog
	As       int
	Reg      int
	Scond    int
	From     Addr
	To       Addr
	Opt      *struct{}
	Forwd    *Prog
	Pcond    *Prog
	Comefrom *Prog
	Pcrel    *Prog
	Spadj    int64
	Mark     int
	Back     int
	Ft       uint8
	Tt       uint8
	Optab    int
	Isize    int
	Printed  uint8
	Width    int8
	Mode     int
	TEXTFLAG uint8
}

func Appendp

func Appendp(ctxt *Link, q *Prog) *Prog

func Brchain

func Brchain(ctxt *Link, p *Prog) *Prog

Inferno utils/6l/pass.c http://code.google.com/p/inferno-os/source/browse/utils/6l/pass.c

Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
Portions Copyright © 1997-1999 Vita Nuova Limited
Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com)
Portions Copyright © 2004,2006 Bruce Ellis
Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others
Portions Copyright © 2009 The Go Authors.  All rights reserved.

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. Code and data passes.

func Copyp

func Copyp(ctxt *Link, q *Prog) *Prog

func (*Prog) Line

func (p *Prog) Line() string

func (*Prog) String

func (p *Prog) String() string

type Reloc

type Reloc struct {
	Off  int64
	Siz  uint8
	Done uint8
	Typ  int
	Add  int64
	Xadd int64
	Sym  *LSym
	Xsym *LSym
}

func Addrel

func Addrel(s *LSym) *Reloc

type Rune

type Rune uint /* Code-point values in Unicode 4.0 are 21 bits wide.*/

* The authors of this software are Rob Pike and Ken Thompson. * Copyright (c) 2002 by Lucent Technologies. * Permission to use, copy, modify, and distribute this software for any * purpose without fee is hereby granted, provided that this entire notice * is included in all copies of any software which is or includes a copy * or modification of this software and in all copies of the supporting * documentation for such software. * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.

* The authors of this software are Rob Pike and Ken Thompson. * Copyright (c) 1998-2002 by Lucent Technologies. * Portions Copyright (c) 2009 The Go Authors. All rights reserved. * Permission to use, copy, modify, and distribute this software for any * purpose without fee is hereby granted, provided that this entire notice * is included in all copies of any software which is or includes a copy * or modification of this software and in all copies of the supporting * documentation for such software. * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL