return off
}
-// stringConstantSyms holds the pair of symbols we create for a
-// constant string.
-type stringConstantSyms struct {
- hdr *obj.LSym // string header
- data *obj.LSym // actual string data
-}
-
-// stringConstants maps from the symbol name we use for the string
-// contents to the pair of linker symbols for that string.
-var stringConstants = make(map[string]stringConstantSyms, 100)
-
-func stringsym(s string) (hdr, data *obj.LSym) {
+func stringsym(s string) (data *obj.LSym) {
var symname string
if len(s) > 100 {
// Huge strings are hashed to avoid long names in object files.
const prefix = "go.string."
symdataname := prefix + symname
- // All the strings have the same prefix, so ignore it for map
- // purposes, but use a slice of the symbol name string to
- // reduce long-term memory overhead.
- key := symdataname[len(prefix):]
-
- if syms, ok := stringConstants[key]; ok {
- return syms.hdr, syms.data
- }
-
- symhdrname := "go.string.hdr." + symname
-
- symhdr := obj.Linklookup(Ctxt, symhdrname, 0)
symdata := obj.Linklookup(Ctxt, symdataname, 0)
- stringConstants[key] = stringConstantSyms{symhdr, symdata}
-
- // string header
- off := 0
- off = dsymptrLSym(symhdr, off, symdata, 0)
- off = duintxxLSym(symhdr, off, uint64(len(s)), Widthint)
- ggloblLSym(symhdr, int32(off), obj.DUPOK|obj.RODATA|obj.LOCAL)
-
- // string data
- off = dsnameLSym(symdata, 0, s)
- ggloblLSym(symdata, int32(off), obj.DUPOK|obj.RODATA|obj.LOCAL)
+ if !symdata.Seenglobl {
+ // string data
+ off := dsnameLSym(symdata, 0, s)
+ ggloblLSym(symdata, int32(off), obj.DUPOK|obj.RODATA|obj.LOCAL)
+ }
- return symhdr, symdata
+ return symdata
}
var slicebytes_gen int
duintxx(nam.Sym, off, uint64(len), Widthint)
}
-func datagostring(sval string, a *obj.Addr) {
- symhdr, _ := stringsym(sval)
- a.Type = obj.TYPE_MEM
- a.Name = obj.NAME_EXTERN
- a.Sym = symhdr
- a.Offset = 0
-}
-
func dsname(s *Sym, off int, t string) int {
return dsnameLSym(Linksym(s), off, t)
}
func gdatastring(nam *Node, sval string) {
s := Linksym(nam.Sym)
- _, symdata := stringsym(sval)
+ symdata := stringsym(sval)
s.WriteAddr(Ctxt, nam.Xoffset, Widthptr, symdata, 0)
s.WriteInt(Ctxt, nam.Xoffset+int64(Widthptr), Widthint, int64(len(sval)))
}
// is the data component of a global string constant containing s.
func (*ssaExport) StringData(s string) interface{} {
// TODO: is idealstring correct? It might not matter...
- _, data := stringsym(s)
+ data := stringsym(s)
return &ssa.ExternSymbol{Typ: idealstring, Sym: data}
}
STYPE
SSTRING
SGOSTRING
- SGOSTRINGHDR
SGOFUNC
SGCBITS
SRODATA
STYPERELRO
SSTRINGRELRO
SGOSTRINGRELRO
- SGOSTRINGHDRRELRO
SGOFUNCRELRO
SGCBITSRELRO
SRODATARELRO
STYPE,
SSTRING,
SGOSTRING,
- SGOSTRINGHDR,
SGOFUNC,
SGCBITS,
SRODATA,
// RelROMap describes the transformation of read-only symbols to rel-ro
// symbols.
var RelROMap = map[SymKind]SymKind{
- STYPE: STYPERELRO,
- SSTRING: SSTRINGRELRO,
- SGOSTRING: SGOSTRINGRELRO,
- SGOSTRINGHDR: SGOSTRINGHDRRELRO,
- SGOFUNC: SGOFUNCRELRO,
- SGCBITS: SGCBITSRELRO,
- SRODATA: SRODATARELRO,
- SFUNCTAB: SFUNCTABRELRO,
+ STYPE: STYPERELRO,
+ SSTRING: SSTRINGRELRO,
+ SGOSTRING: SGOSTRINGRELRO,
+ SGOFUNC: SGOFUNCRELRO,
+ SGCBITS: SGCBITSRELRO,
+ SRODATA: SRODATARELRO,
+ SFUNCTAB: SFUNCTABRELRO,
}
type Reloc struct {
import "fmt"
-const _SymKind_name = "SxxxSTEXTSELFRXSECTSTYPESSTRINGSGOSTRINGSGOSTRINGHDRSGOFUNCSGCBITSSRODATASFUNCTABSELFROSECTSMACHOPLTSTYPERELROSSTRINGRELROSGOSTRINGRELROSGOSTRINGHDRRELROSGOFUNCRELROSGCBITSRELROSRODATARELROSFUNCTABRELROSTYPELINKSITABLINKSSYMTABSPCLNTABSELFSECTSMACHOSMACHOGOTSWINDOWSSELFGOTSNOPTRDATASINITARRSDATASBSSSNOPTRBSSSTLSBSSSXREFSMACHOSYMSTRSMACHOSYMTABSMACHOINDIRECTPLTSMACHOINDIRECTGOTSFILESFILEPATHSCONSTSDYNIMPORTSHOSTOBJSDWARFSECTSDWARFINFO"
+const _SymKind_name = "SxxxSTEXTSELFRXSECTSTYPESSTRINGSGOSTRINGSGOFUNCSGCBITSSRODATASFUNCTABSELFROSECTSMACHOPLTSTYPERELROSSTRINGRELROSGOSTRINGRELROSGOFUNCRELROSGCBITSRELROSRODATARELROSFUNCTABRELROSTYPELINKSITABLINKSSYMTABSPCLNTABSELFSECTSMACHOSMACHOGOTSWINDOWSSELFGOTSNOPTRDATASINITARRSDATASBSSSNOPTRBSSSTLSBSSSXREFSMACHOSYMSTRSMACHOSYMTABSMACHOINDIRECTPLTSMACHOINDIRECTGOTSFILESFILEPATHSCONSTSDYNIMPORTSHOSTOBJSDWARFSECTSDWARFINFO"
-var _SymKind_index = [...]uint16{0, 4, 9, 19, 24, 31, 40, 52, 59, 66, 73, 81, 91, 100, 110, 122, 136, 153, 165, 177, 189, 202, 211, 220, 227, 235, 243, 249, 258, 266, 273, 283, 291, 296, 300, 309, 316, 321, 333, 345, 362, 379, 384, 393, 399, 409, 417, 427, 437}
+var _SymKind_index = [...]uint16{0, 4, 9, 19, 24, 31, 40, 47, 54, 61, 69, 79, 88, 98, 110, 124, 136, 148, 160, 173, 182, 191, 198, 206, 214, 220, 229, 237, 244, 254, 262, 267, 271, 280, 287, 292, 304, 316, 333, 350, 355, 364, 370, 380, 388, 398, 408}
func (i SymKind) String() string {
if i < 0 || i >= SymKind(len(_SymKind_index)-1) {
} else if s.Align != 0 {
return min
}
- if (strings.HasPrefix(s.Name, "go.string.") && !strings.HasPrefix(s.Name, "go.string.hdr.")) || strings.HasPrefix(s.Name, "type..namedata.") {
+ if strings.HasPrefix(s.Name, "go.string.") || strings.HasPrefix(s.Name, "type..namedata.") {
// String data is just bytes.
// If we align it, we waste a lot of space to padding.
return min
for _, s := range data[symnro] {
isRelro := len(s.R) > 0
switch s.Type {
- case obj.STYPE, obj.SGOSTRINGHDR, obj.STYPERELRO, obj.SGOSTRINGHDRRELRO, obj.SGOFUNCRELRO:
+ case obj.STYPE, obj.STYPERELRO, obj.SGOFUNCRELRO:
// Symbols are not sorted yet, so it is possible
// that an Outer symbol has been changed to a
// relro Type before it reaches here.
obj.STYPE,
obj.SSTRING,
obj.SGOSTRING,
- obj.SGOSTRINGHDR,
obj.SGOFUNC,
obj.SGCBITS,
obj.STYPERELRO,
obj.SSTRINGRELRO,
obj.SGOSTRINGRELRO,
- obj.SGOSTRINGHDRRELRO,
obj.SGOFUNCRELRO,
obj.SGCBITSRELRO,
obj.SRODATARELRO,
return s
}
var (
- symgostring = groupSym("go.string.*", obj.SGOSTRING)
- symgostringhdr = groupSym("go.string.hdr.*", obj.SGOSTRINGHDR)
- symgofunc = groupSym("go.func.*", obj.SGOFUNC)
- symgcbits = groupSym("runtime.gcbits.*", obj.SGCBITS)
+ symgostring = groupSym("go.string.*", obj.SGOSTRING)
+ symgofunc = groupSym("go.func.*", obj.SGOFUNC)
+ symgcbits = groupSym("runtime.gcbits.*", obj.SGCBITS)
)
var symgofuncrel *Symbol
s.Type = obj.SGOSTRING
s.Attr |= AttrHidden
s.Outer = symgostring
- if strings.HasPrefix(s.Name, "go.string.hdr.") {
- s.Type = obj.SGOSTRINGHDR
- s.Outer = symgostringhdr
- }
case strings.HasPrefix(s.Name, "runtime.gcbits."):
s.Type = obj.SGCBITS