blob: 746a12efd6252cd804d6a75659b9c97de6810fd8 [file] [log] [blame]
// Derived from Inferno utils/6l/l.h and related files.
// https://bitbucket.org/inferno-os/inferno-os/src/master/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 sym
import "cmd/internal/objabi"
// A SymKind describes the kind of memory represented by a symbol.
type SymKind uint8
// Defined SymKind values.
//
// TODO(rsc): Give idiomatic Go names.
//
//go:generate stringer -type=SymKind
const (
// An otherwise invalid zero value for the type.
Sxxx SymKind = iota
// The text segment, containing executable instructions.
STEXT // General executable code.
STEXTFIPSSTART // Start of FIPS text section.
STEXTFIPS // Instructions hashed for FIPS checks.
STEXTFIPSEND // End of FIPS text section.
STEXTEND // End of text section.
SELFRXSECT // Executable PLT; PPC64 .glink.
SMACHOPLT // Mach-O PLT.
// Read-only, non-executable, segment.
STYPE // Type descriptors.
SSTRING // Used only for XCOFF runtime.rodata symbol?
SGOSTRING // Go string constants.
SGOFUNC // Function descriptors and funcdata symbols.
SGCBITS // GC bit masks and programs.
SRODATA // General read-only data.
SRODATAFIPSSTART // Start of FIPS read-only data.
SRODATAFIPS // FIPS read-only data.
SRODATAFIPSEND // End of FIPS read-only data.
SRODATAEND // End of read-only data.
SFUNCTAB // Appears to be unused, except for runtime.etypes.
SPCLNTAB // Pclntab data.
SELFROSECT // ELF read-only data: relocs, dynamic linking info.
// Read-only, non-executable, dynamically relocatable segment.
//
// 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
SELFRELROSECT // ELF-specific read-only relocatable: PLT, etc.
SMACHORELROSECT // Mach-O specific read-only relocatable.
STYPELINK // Type links.
SITABLINK // Itab links.
// Allocated writable segment.
SFirstWritable
SBUILDINFO // debug/buildinfo data (why is this writable?).
SFIPSINFO // go:fipsinfo aka crypto/internal/fips140/check.Linkinfo (why is this writable)?
SELFSECT // .got.plt, .plt, .dynamic where appropriate.
SMACHO // Used only for .llvmasm?
SWINDOWS // Windows dynamic symbols.
SMODULEDATA // Linker generated moduledata struct.
SELFGOT // Writable ELF GOT section.
SMACHOGOT // Mach-O GOT.
SNOPTRDATA // Data with no heap pointers.
SNOPTRDATAFIPSSTART // Start of FIPS non-pointer writable data.
SNOPTRDATAFIPS // FIPS non-pointer writable data.
SNOPTRDATAFIPSEND // End of FIPS non-pointer writable data.
SNOPTRDATAEND // End of data with no heap pointers.
SINITARR // ELF .init_array section.
SDATA // Data that may have heap pointers.
SDATAFIPSSTART // Start of FIPS writable data.
SDATAFIPS // FIPS writable data.
SDATAFIPSEND // End of FIPS writable data.
SDATAEND // End of data that may have heap pointers.
SXCOFFTOC // AIX TOC entries.
// Allocated zero-initialized segment.
SBSS // Zeroed data that may have heap pointers.
SNOPTRBSS // Zeroed data with no heap pointers.
SLIBFUZZER_8BIT_COUNTER // Fuzzer counters.
SCOVERAGE_COUNTER // Coverage counters.
SCOVERAGE_AUXVAR // Compiler generated coverage symbols.
STLSBSS // Thread-local zeroed data.
// Unallocated segment.
SFirstUnallocated
SXREF // Reference from non-Go object file.
SMACHOSYMSTR // Mach-O string table.
SMACHOSYMTAB // Mach-O symbol table.
SMACHOINDIRECTPLT // Mach-O indirect PLT.
SMACHOINDIRECTGOT // Mach-O indirect GOT.
SDYNIMPORT // Reference to symbol defined in shared library.
SHOSTOBJ // Symbol defined in non-Go object file.
SUNDEFEXT // Undefined symbol for resolution by external linker.
// Unallocated DWARF debugging segment.
SDWARFSECT
// DWARF symbol types created by compiler or linker.
SDWARFCUINFO
SDWARFCONST
SDWARFFCN
SDWARFABSFCN
SDWARFTYPE
SDWARFVAR
SDWARFRANGE
SDWARFLOC
SDWARFLINES
SDWARFADDR
// SEH symbol types. These are probably allocated at run time.
SSEHUNWINDINFO // Compiler generated Windows SEH info.
SSEHSECT // Windows SEH data.
)
// AbiSymKindToSymKind maps values read from object files (which are
// of type cmd/internal/objabi.SymKind) to values of type SymKind.
var AbiSymKindToSymKind = [...]SymKind{
objabi.Sxxx: Sxxx,
objabi.STEXT: STEXT,
objabi.STEXTFIPS: STEXTFIPS,
objabi.SRODATA: SRODATA,
objabi.SRODATAFIPS: SRODATAFIPS,
objabi.SNOPTRDATA: SNOPTRDATA,
objabi.SNOPTRDATAFIPS: SNOPTRDATAFIPS,
objabi.SDATA: SDATA,
objabi.SDATAFIPS: SDATAFIPS,
objabi.SBSS: SBSS,
objabi.SNOPTRBSS: SNOPTRBSS,
objabi.STLSBSS: STLSBSS,
objabi.SDWARFCUINFO: SDWARFCUINFO,
objabi.SDWARFCONST: SDWARFCONST,
objabi.SDWARFFCN: SDWARFFCN,
objabi.SDWARFABSFCN: SDWARFABSFCN,
objabi.SDWARFTYPE: SDWARFTYPE,
objabi.SDWARFVAR: SDWARFVAR,
objabi.SDWARFRANGE: SDWARFRANGE,
objabi.SDWARFLOC: SDWARFLOC,
objabi.SDWARFLINES: SDWARFLINES,
objabi.SDWARFADDR: SDWARFADDR,
objabi.SLIBFUZZER_8BIT_COUNTER: SLIBFUZZER_8BIT_COUNTER,
objabi.SCOVERAGE_COUNTER: SCOVERAGE_COUNTER,
objabi.SCOVERAGE_AUXVAR: SCOVERAGE_AUXVAR,
objabi.SSEHUNWINDINFO: SSEHUNWINDINFO,
}
// 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,
SRODATAFIPSSTART,
SRODATAFIPS,
SRODATAFIPSEND,
SRODATAEND,
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,
}
// IsText returns true if t is a text type.
func (t SymKind) IsText() bool {
return STEXT <= t && t <= STEXTEND
}
// IsData returns true if t is any kind of data type.
func (t SymKind) IsData() bool {
return SNOPTRDATA <= t && t <= SNOPTRBSS
}
// IsDATA returns true if t is one of the SDATA types.
func (t SymKind) IsDATA() bool {
return SDATA <= t && t <= SDATAEND
}
// IsRODATA returns true if t is one of the SRODATA types.
func (t SymKind) IsRODATA() bool {
return SRODATA <= t && t <= SRODATAEND
}
// IsNOPTRDATA returns true if t is one of the SNOPTRDATA types.
func (t SymKind) IsNOPTRDATA() bool {
return SNOPTRDATA <= t && t <= SNOPTRDATAEND
}
func (t SymKind) IsDWARF() bool {
return SDWARFSECT <= t && t <= SDWARFADDR
}