Black Lives Matter. Support the Equal Justice Initiative.

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  

View as plain text