...
Run Format

Source file src/cmd/link/internal/ld/symkind.go

Documentation: cmd/link/internal/ld

  // Derived from Inferno utils/6l/l.h and related files.
  // https://bitbucket.org/inferno-os/inferno-os/src/default/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.
  
  package ld
  
  // A SymKind describes the kind of memory represented by a symbol.
  type SymKind int16
  
  // Defined SymKind values.
  //
  // TODO(rsc): Give idiomatic Go names.
  //go:generate stringer -type=SymKind
  const (
  	Sxxx SymKind = iota
  	STEXT
  	SELFRXSECT
  
  	// Read-only sections.
  	STYPE
  	SSTRING
  	SGOSTRING
  	SGOFUNC
  	SGCBITS
  	SRODATA
  	SFUNCTAB
  
  	SELFROSECT
  	SMACHOPLT
  
  	// Read-only sections with relocations.
  	//
  	// Types STYPE-SFUNCTAB above are written to the .rodata section by default.
  	// When linking a shared object, some conceptually "read only" types need to
  	// be written to by relocations and putting them in a section called
  	// ".rodata" interacts poorly with the system linkers. The GNU linkers
  	// support this situation by arranging for sections of the name
  	// ".data.rel.ro.XXX" to be mprotected read only by the dynamic linker after
  	// relocations have applied, so when the Go linker is creating a shared
  	// object it checks all objects of the above types and bumps any object that
  	// has a relocation to it to the corresponding type below, which are then
  	// written to sections with appropriate magic names.
  	STYPERELRO
  	SSTRINGRELRO
  	SGOSTRINGRELRO
  	SGOFUNCRELRO
  	SGCBITSRELRO
  	SRODATARELRO
  	SFUNCTABRELRO
  
  	// Part of .data.rel.ro if it exists, otherwise part of .rodata.
  	STYPELINK
  	SITABLINK
  	SSYMTAB
  	SPCLNTAB
  
  	// Writable sections.
  	SELFSECT
  	SMACHO
  	SMACHOGOT
  	SWINDOWS
  	SELFGOT
  	SNOPTRDATA
  	SINITARR
  	SDATA
  	SBSS
  	SNOPTRBSS
  	STLSBSS
  	SXREF
  	SMACHOSYMSTR
  	SMACHOSYMTAB
  	SMACHOINDIRECTPLT
  	SMACHOINDIRECTGOT
  	SFILE
  	SFILEPATH
  	SCONST
  	SDYNIMPORT
  	SHOSTOBJ
  	SDWARFSECT
  	SDWARFINFO
  	SDWARFRANGE
  	SSUB       = SymKind(1 << 8)
  	SMASK      = SymKind(SSUB - 1)
  	SHIDDEN    = SymKind(1 << 9)
  	SCONTAINER = SymKind(1 << 10) // has a sub-symbol
  )
  
  // abiSymKindToSymKind maps values read from object files (which are
  // of type cmd/internal/objabi.SymKind) to values of type SymKind.
  var abiSymKindToSymKind = [...]SymKind{
  	Sxxx,
  	STEXT,
  	SRODATA,
  	SNOPTRDATA,
  	SDATA,
  	SBSS,
  	SNOPTRBSS,
  	STLSBSS,
  	SDWARFINFO,
  	SDWARFRANGE,
  }
  
  // readOnly are the symbol kinds that form read-only sections. In some
  // cases, if they will require relocations, they are transformed into
  // rel-ro sections using relROMap.
  var readOnly = []SymKind{
  	STYPE,
  	SSTRING,
  	SGOSTRING,
  	SGOFUNC,
  	SGCBITS,
  	SRODATA,
  	SFUNCTAB,
  }
  
  // relROMap describes the transformation of read-only symbols to rel-ro
  // symbols.
  var relROMap = map[SymKind]SymKind{
  	STYPE:     STYPERELRO,
  	SSTRING:   SSTRINGRELRO,
  	SGOSTRING: SGOSTRINGRELRO,
  	SGOFUNC:   SGOFUNCRELRO,
  	SGCBITS:   SGCBITSRELRO,
  	SRODATA:   SRODATARELRO,
  	SFUNCTAB:  SFUNCTABRELRO,
  }
  

View as plain text