for _, s := range data[symnro] {
isRelro := len(s.R) > 0
switch s.Type {
- case obj.STYPE, obj.SGOSTRINGHDR, obj.STYPERELRO, obj.SGOSTRINGHDRRELRO:
+ case obj.STYPE, obj.SGOSTRINGHDR, obj.STYPERELRO, obj.SGOSTRINGHDRRELRO, 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.
for _, s := range data[symn] {
datsize = aligndatsize(datsize, s)
if s.Outer != nil && s.Outer.Sect != nil && s.Outer.Sect != sect {
- ctxt.Diag("s.Outer (%s) in different section from s (%s)", s.Outer.Name, s.Name)
+ ctxt.Diag("s.Outer (%s) in different section from s (%s), %s != %s", s.Outer.Name, s.Name, s.Outer.Sect.Name, sect.Name)
}
s.Sect = sect
s.Type = obj.SRODATA
symgcbits = groupSym("runtime.gcbits.*", obj.SGCBITS)
)
+ var symgofuncrel *Symbol
+ if !DynlinkingGo() {
+ if UseRelro() {
+ symgofuncrel = groupSym("go.funcrel.*", obj.SGOFUNCRELRO)
+ } else {
+ symgofuncrel = symgofunc
+ }
+ }
+
symtypelink := Linklookup(ctxt, "runtime.typelink", 0)
symtypelink.Type = obj.STYPELINK
s.Attr |= AttrHidden
s.Outer = symgcbits
- case strings.HasPrefix(s.Name, "go.func."):
- s.Type = obj.SGOFUNC
- s.Attr |= AttrHidden
- s.Outer = symgofunc
+ case strings.HasSuffix(s.Name, "·f"):
+ if !DynlinkingGo() {
+ s.Attr |= AttrHidden
+ }
+ if UseRelro() {
+ s.Type = obj.SGOFUNCRELRO
+ s.Outer = symgofuncrel
+ } else {
+ s.Type = obj.SGOFUNC
+ s.Outer = symgofunc
+ }
case strings.HasPrefix(s.Name, "gcargs."), strings.HasPrefix(s.Name, "gclocals."), strings.HasPrefix(s.Name, "gclocals·"):
s.Type = obj.SGOFUNC