name := s.Name
if s.IsPcdata() {
return 'P'
- } else if strings.HasPrefix(name, "type.") {
+ }
+ if strings.HasPrefix(name, "runtime.gcbits.") {
+ return 'G' // gcbits
+ }
+ if strings.HasPrefix(name, "gcargs.") ||
+ strings.HasPrefix(name, "gclocals.") ||
+ strings.HasPrefix(name, "gclocals·") ||
+ strings.HasSuffix(name, ".opendefer") ||
+ strings.HasSuffix(name, ".arginfo0") ||
+ strings.HasSuffix(name, ".arginfo1") ||
+ strings.HasSuffix(name, ".args_stackmap") ||
+ strings.HasSuffix(name, ".stkobj") {
+ return 'F' // go.func.* or go.funcrel.*
+ }
+ if strings.HasPrefix(name, "type.") {
return 'T'
}
return 0
symgcbits = groupSym("runtime.gcbits.*", sym.SGCBITS)
)
- var symgofuncrel loader.Sym
- if !ctxt.DynlinkingGo() {
- if ctxt.UseRelro() {
- symgofuncrel = groupSym("go.funcrel.*", sym.SGOFUNCRELRO)
- } else {
- symgofuncrel = symgofunc
- }
+ symgofuncrel := symgofunc
+ if ctxt.UseRelro() {
+ symgofuncrel = groupSym("go.funcrel.*", sym.SGOFUNCRELRO)
}
symt := ldr.CreateSymForUpdate("runtime.symtab", 0)
}
if ctxt.UseRelro() {
symGroupType[s] = sym.SGOFUNCRELRO
- if symgofuncrel != 0 {
+ if !ctxt.DynlinkingGo() {
ldr.SetCarrierSym(s, symgofuncrel)
}
} else {
ldr.SymType(s) == sym.SGOFUNC && s != symgofunc, // inltree, see pcln.go
strings.HasSuffix(name, ".opendefer"),
strings.HasSuffix(name, ".arginfo0"),
- strings.HasSuffix(name, ".arginfo1"):
- symGroupType[s] = sym.SGOFUNC
+ strings.HasSuffix(name, ".arginfo1"),
+ strings.HasSuffix(name, ".args_stackmap"),
+ strings.HasSuffix(name, ".stkobj"):
ldr.SetAttrNotInSymbolTable(s, true)
- ldr.SetCarrierSym(s, symgofunc)
+ if ctxt.UseRelro() && strings.HasSuffix(name, ".stkobj") {
+ symGroupType[s] = sym.SGOFUNCRELRO
+ ldr.SetCarrierSym(s, symgofuncrel)
+ } else {
+ symGroupType[s] = sym.SGOFUNC
+ ldr.SetCarrierSym(s, symgofunc)
+ }
if ctxt.Debugvlog != 0 {
align := ldr.SymAlign(s)
liveness += (ldr.SymSize(s) + int64(align) - 1) &^ (int64(align) - 1)