Home | History | Annotate | Download | only in ld
      1 // Derived from Inferno utils/6l/obj.c and utils/6l/span.c
      2 // https://bitbucket.org/inferno-os/inferno-os/src/default/utils/6l/obj.c
      3 // https://bitbucket.org/inferno-os/inferno-os/src/default/utils/6l/span.c
      4 //
      5 //	Copyright  1994-1999 Lucent Technologies Inc.  All rights reserved.
      6 //	Portions Copyright  1995-1997 C H Forsyth (forsyth (a] terzarima.net)
      7 //	Portions Copyright  1997-1999 Vita Nuova Limited
      8 //	Portions Copyright  2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com)
      9 //	Portions Copyright  2004,2006 Bruce Ellis
     10 //	Portions Copyright  2005-2007 C H Forsyth (forsyth (a] terzarima.net)
     11 //	Revisions Copyright  2000-2007 Lucent Technologies Inc. and others
     12 //	Portions Copyright  2009 The Go Authors. All rights reserved.
     13 //
     14 // Permission is hereby granted, free of charge, to any person obtaining a copy
     15 // of this software and associated documentation files (the "Software"), to deal
     16 // in the Software without restriction, including without limitation the rights
     17 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     18 // copies of the Software, and to permit persons to whom the Software is
     19 // furnished to do so, subject to the following conditions:
     20 //
     21 // The above copyright notice and this permission notice shall be included in
     22 // all copies or substantial portions of the Software.
     23 //
     24 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     25 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     26 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
     27 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     28 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     29 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
     30 // THE SOFTWARE.
     31 
     32 package ld
     33 
     34 import (
     35 	"cmd/internal/objabi"
     36 	"cmd/internal/sys"
     37 	"cmd/link/internal/sym"
     38 	"log"
     39 )
     40 
     41 func linknew(arch *sys.Arch) *Link {
     42 	ctxt := &Link{
     43 		Syms:         sym.NewSymbols(),
     44 		Out:          &OutBuf{arch: arch},
     45 		Arch:         arch,
     46 		LibraryByPkg: make(map[string]*sym.Library),
     47 	}
     48 
     49 	if objabi.GOARCH != arch.Name {
     50 		log.Fatalf("invalid objabi.GOARCH %s (want %s)", objabi.GOARCH, arch.Name)
     51 	}
     52 
     53 	AtExit(func() {
     54 		if nerrors > 0 && ctxt.Out.f != nil {
     55 			ctxt.Out.f.Close()
     56 			mayberemoveoutfile()
     57 		}
     58 	})
     59 
     60 	return ctxt
     61 }
     62 
     63 // computeTLSOffset records the thread-local storage offset.
     64 func (ctxt *Link) computeTLSOffset() {
     65 	switch ctxt.HeadType {
     66 	default:
     67 		log.Fatalf("unknown thread-local storage offset for %v", ctxt.HeadType)
     68 
     69 	case objabi.Hplan9, objabi.Hwindows:
     70 		break
     71 
     72 		/*
     73 		 * ELF uses TLS offset negative from FS.
     74 		 * Translate 0(FS) and 8(FS) into -16(FS) and -8(FS).
     75 		 * Known to low-level assembly in package runtime and runtime/cgo.
     76 		 */
     77 	case objabi.Hlinux,
     78 		objabi.Hfreebsd,
     79 		objabi.Hnetbsd,
     80 		objabi.Hopenbsd,
     81 		objabi.Hdragonfly,
     82 		objabi.Hsolaris:
     83 		if objabi.GOOS == "android" {
     84 			switch ctxt.Arch.Family {
     85 			case sys.AMD64:
     86 				// Android/amd64 constant - offset from 0(FS) to our TLS slot.
     87 				// Explained in src/runtime/cgo/gcc_android_*.c
     88 				ctxt.Tlsoffset = 0x1d0
     89 			case sys.I386:
     90 				// Android/386 constant - offset from 0(GS) to our TLS slot.
     91 				ctxt.Tlsoffset = 0xf8
     92 			default:
     93 				ctxt.Tlsoffset = -1 * ctxt.Arch.PtrSize
     94 			}
     95 		} else {
     96 			ctxt.Tlsoffset = -1 * ctxt.Arch.PtrSize
     97 		}
     98 
     99 	case objabi.Hnacl:
    100 		switch ctxt.Arch.Family {
    101 		default:
    102 			log.Fatalf("unknown thread-local storage offset for nacl/%s", ctxt.Arch.Name)
    103 
    104 		case sys.ARM:
    105 			ctxt.Tlsoffset = 0
    106 
    107 		case sys.AMD64:
    108 			ctxt.Tlsoffset = 0
    109 
    110 		case sys.I386:
    111 			ctxt.Tlsoffset = -8
    112 		}
    113 
    114 		/*
    115 		 * OS X system constants - offset from 0(GS) to our TLS.
    116 		 * Explained in src/runtime/cgo/gcc_darwin_*.c.
    117 		 */
    118 	case objabi.Hdarwin:
    119 		switch ctxt.Arch.Family {
    120 		default:
    121 			log.Fatalf("unknown thread-local storage offset for darwin/%s", ctxt.Arch.Name)
    122 
    123 		case sys.ARM:
    124 			ctxt.Tlsoffset = 0 // dummy value, not needed
    125 
    126 		case sys.AMD64:
    127 			ctxt.Tlsoffset = 0x8a0
    128 
    129 		case sys.ARM64:
    130 			ctxt.Tlsoffset = 0 // dummy value, not needed
    131 
    132 		case sys.I386:
    133 			ctxt.Tlsoffset = 0x468
    134 		}
    135 	}
    136 
    137 }
    138