Source file src/cmd/link/internal/sym/symkind.go
Documentation: cmd/link/internal/sym
1 // Derived from Inferno utils/6l/l.h and related files. 2 // https://bitbucket.org/inferno-os/inferno-os/src/master/utils/6l/l.h 3 // 4 // Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. 5 // Portions Copyright © 1995-1997 C H Forsyth (forsyth@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@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 sym 32 33 // A SymKind describes the kind of memory represented by a symbol. 34 type SymKind uint8 35 36 // Defined SymKind values. 37 // 38 // TODO(rsc): Give idiomatic Go names. 39 //go:generate stringer -type=SymKind 40 const ( 41 Sxxx SymKind = iota 42 STEXT 43 SELFRXSECT 44 SMACHOPLT 45 46 // Read-only sections. 47 STYPE 48 SSTRING 49 SGOSTRING 50 SGOFUNC 51 SGCBITS 52 SRODATA 53 SFUNCTAB 54 55 SELFROSECT 56 57 // Read-only sections with relocations. 58 // 59 // Types STYPE-SFUNCTAB above are written to the .rodata section by default. 60 // When linking a shared object, some conceptually "read only" types need to 61 // be written to by relocations and putting them in a section called 62 // ".rodata" interacts poorly with the system linkers. The GNU linkers 63 // support this situation by arranging for sections of the name 64 // ".data.rel.ro.XXX" to be mprotected read only by the dynamic linker after 65 // relocations have applied, so when the Go linker is creating a shared 66 // object it checks all objects of the above types and bumps any object that 67 // has a relocation to it to the corresponding type below, which are then 68 // written to sections with appropriate magic names. 69 STYPERELRO 70 SSTRINGRELRO 71 SGOSTRINGRELRO 72 SGOFUNCRELRO 73 SGCBITSRELRO 74 SRODATARELRO 75 SFUNCTABRELRO 76 77 // Part of .data.rel.ro if it exists, otherwise part of .rodata. 78 STYPELINK 79 SITABLINK 80 SSYMTAB 81 SPCLNTAB 82 83 // Writable sections. 84 SFirstWritable 85 SBUILDINFO 86 SELFSECT 87 SMACHO 88 SMACHOGOT 89 SWINDOWS 90 SELFGOT 91 SNOPTRDATA 92 SINITARR 93 SDATA 94 SXCOFFTOC 95 SBSS 96 SNOPTRBSS 97 SLIBFUZZER_EXTRA_COUNTER 98 STLSBSS 99 SXREF 100 SMACHOSYMSTR 101 SMACHOSYMTAB 102 SMACHOINDIRECTPLT 103 SMACHOINDIRECTGOT 104 SFILEPATH 105 SDYNIMPORT 106 SHOSTOBJ 107 SUNDEFEXT // Undefined symbol for resolution by external linker 108 109 // Sections for debugging information 110 SDWARFSECT 111 // DWARF symbol types 112 SDWARFCUINFO 113 SDWARFCONST 114 SDWARFFCN 115 SDWARFABSFCN 116 SDWARFTYPE 117 SDWARFVAR 118 SDWARFRANGE 119 SDWARFLOC 120 SDWARFLINES 121 122 // ABI aliases (these never appear in the output) 123 SABIALIAS 124 ) 125 126 // AbiSymKindToSymKind maps values read from object files (which are 127 // of type cmd/internal/objabi.SymKind) to values of type SymKind. 128 var AbiSymKindToSymKind = [...]SymKind{ 129 Sxxx, 130 STEXT, 131 SRODATA, 132 SNOPTRDATA, 133 SDATA, 134 SBSS, 135 SNOPTRBSS, 136 STLSBSS, 137 SDWARFCUINFO, 138 SDWARFCONST, 139 SDWARFFCN, 140 SDWARFABSFCN, 141 SDWARFTYPE, 142 SDWARFVAR, 143 SDWARFRANGE, 144 SDWARFLOC, 145 SDWARFLINES, 146 SABIALIAS, 147 SLIBFUZZER_EXTRA_COUNTER, 148 } 149 150 // ReadOnly are the symbol kinds that form read-only sections. In some 151 // cases, if they will require relocations, they are transformed into 152 // rel-ro sections using relROMap. 153 var ReadOnly = []SymKind{ 154 STYPE, 155 SSTRING, 156 SGOSTRING, 157 SGOFUNC, 158 SGCBITS, 159 SRODATA, 160 SFUNCTAB, 161 } 162 163 // RelROMap describes the transformation of read-only symbols to rel-ro 164 // symbols. 165 var RelROMap = map[SymKind]SymKind{ 166 STYPE: STYPERELRO, 167 SSTRING: SSTRINGRELRO, 168 SGOSTRING: SGOSTRINGRELRO, 169 SGOFUNC: SGOFUNCRELRO, 170 SGCBITS: SGCBITSRELRO, 171 SRODATA: SRODATARELRO, 172 SFUNCTAB: SFUNCTABRELRO, 173 } 174 175 // IsData returns true if the type is a data type. 176 func (t SymKind) IsData() bool { 177 return t == SDATA || t == SNOPTRDATA || t == SBSS || t == SNOPTRBSS 178 } 179