1 // Derived from Inferno utils/6l/l.h and related files. 2 // http://code.google.com/p/inferno-os/source/browse/utils/6l/l.h 3 // 4 // Copyright 1994-1999 Lucent Technologies Inc. All rights reserved. 5 // Portions Copyright 1995-1997 C H Forsyth (forsyth (a] terzarima.net) 6 // Portions Copyright 1997-1999 Vita Nuova Limited 7 // Portions Copyright 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com) 8 // Portions Copyright 2004,2006 Bruce Ellis 9 // Portions Copyright 2005-2007 C H Forsyth (forsyth (a] terzarima.net) 10 // Revisions Copyright 2000-2007 Lucent Technologies Inc. and others 11 // Portions Copyright 2009 The Go Authors. All rights reserved. 12 // 13 // Permission is hereby granted, free of charge, to any person obtaining a copy 14 // of this software and associated documentation files (the "Software"), to deal 15 // in the Software without restriction, including without limitation the rights 16 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 17 // copies of the Software, and to permit persons to whom the Software is 18 // furnished to do so, subject to the following conditions: 19 // 20 // The above copyright notice and this permission notice shall be included in 21 // all copies or substantial portions of the Software. 22 // 23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 24 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 25 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 26 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 27 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 28 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 29 // THE SOFTWARE. 30 31 package ld 32 33 import ( 34 "cmd/internal/obj" 35 "debug/elf" 36 "encoding/binary" 37 "fmt" 38 ) 39 40 type LSym struct { 41 Name string 42 Extname string 43 Type int16 44 Version int16 45 Dupok uint8 46 Cfunc uint8 47 External uint8 48 Nosplit uint8 49 Reachable bool 50 Cgoexport uint8 51 Special uint8 52 Stkcheck uint8 53 Hide uint8 54 Leaf uint8 55 Localentry uint8 56 Onlist uint8 57 // ElfType is set for symbols read from shared libraries by ldshlibsyms. It 58 // is not set for symbols defined by the packages being linked or by symbols 59 // read by ldelf (and so is left as elf.STT_NOTYPE). 60 ElfType elf.SymType 61 Dynid int32 62 Plt int32 63 Got int32 64 Align int32 65 Elfsym int32 66 Args int32 67 Locals int32 68 Value int64 69 Size int64 70 Hash *LSym 71 Allsym *LSym 72 Next *LSym 73 Sub *LSym 74 Outer *LSym 75 Gotype *LSym 76 Reachparent *LSym 77 Queue *LSym 78 File string 79 Dynimplib string 80 Dynimpvers string 81 Sect *Section 82 Autom *Auto 83 Pcln *Pcln 84 P []byte 85 R []Reloc 86 Local bool 87 } 88 89 func (s *LSym) String() string { 90 if s.Version == 0 { 91 return s.Name 92 } 93 return fmt.Sprintf("%s<%d>", s.Name, s.Version) 94 } 95 96 type Reloc struct { 97 Off int32 98 Siz uint8 99 Done uint8 100 Type int32 101 Variant int32 102 Add int64 103 Xadd int64 104 Sym *LSym 105 Xsym *LSym 106 } 107 108 type Auto struct { 109 Asym *LSym 110 Link *Auto 111 Aoffset int32 112 Name int16 113 Gotype *LSym 114 } 115 116 type Shlib struct { 117 Path string 118 Hash []byte 119 Deps []string 120 File *elf.File 121 } 122 123 type Link struct { 124 Thechar int32 125 Thestring string 126 Goarm int32 127 Headtype int 128 Arch *LinkArch 129 Debugasm int32 130 Debugvlog int32 131 Bso *obj.Biobuf 132 Windows int32 133 Goroot string 134 Hash map[symVer]*LSym 135 Allsym *LSym 136 Nsymbol int32 137 Tlsg *LSym 138 Libdir []string 139 Library []*Library 140 Shlibs []Shlib 141 Tlsoffset int 142 Diag func(string, ...interface{}) 143 Cursym *LSym 144 Version int 145 Textp *LSym 146 Etextp *LSym 147 Nhistfile int32 148 Filesyms *LSym 149 } 150 151 type LinkArch struct { 152 ByteOrder binary.ByteOrder 153 Name string 154 Thechar int 155 Minlc int 156 Ptrsize int 157 Regsize int 158 } 159 160 type Library struct { 161 Objref string 162 Srcref string 163 File string 164 Pkg string 165 Shlib string 166 hash []byte 167 } 168 169 type Pcln struct { 170 Pcsp Pcdata 171 Pcfile Pcdata 172 Pcline Pcdata 173 Pcdata []Pcdata 174 Npcdata int 175 Funcdata []*LSym 176 Funcdataoff []int64 177 Nfuncdata int 178 File []*LSym 179 Nfile int 180 Mfile int 181 Lastfile *LSym 182 Lastindex int 183 } 184 185 type Pcdata struct { 186 P []byte 187 } 188 189 type Pciter struct { 190 d Pcdata 191 p []byte 192 pc uint32 193 nextpc uint32 194 pcscale uint32 195 value int32 196 start int 197 done int 198 } 199 200 // Reloc.variant 201 const ( 202 RV_NONE = iota 203 RV_POWER_LO 204 RV_POWER_HI 205 RV_POWER_HA 206 RV_POWER_DS 207 RV_CHECK_OVERFLOW = 1 << 8 208 RV_TYPE_MASK = RV_CHECK_OVERFLOW - 1 209 ) 210 211 const ( 212 LINKHASH = 100003 213 ) 214 215 // Pcdata iterator. 216 // for(pciterinit(ctxt, &it, &pcd); !it.done; pciternext(&it)) { it.value holds in [it.pc, it.nextpc) } 217 218 // Link holds the context for writing object code from a compiler 219 // to be linker input or for reading that input into the linker. 220 221 // LinkArch is the definition of a single architecture. 222 223 const ( 224 LinkAuto = 0 + iota 225 LinkInternal 226 LinkExternal 227 ) 228