const (
ObjFlagShared = 1 << iota // this object is built with -shared
ObjFlagNeedNameExpansion // the linker needs to expand `"".` to package path in symbol names
+ ObjFlagFromAssembly // object is from asm src, not go
)
// Sym.Flag
func (r *Reader) Shared() bool { return r.Flags()&ObjFlagShared != 0 }
func (r *Reader) NeedNameExpansion() bool { return r.Flags()&ObjFlagNeedNameExpansion != 0 }
+func (r *Reader) FromAssembly() bool { return r.Flags()&ObjFlagFromAssembly != 0 }
if pkgpath == "" {
flags |= goobj2.ObjFlagNeedNameExpansion
}
+ if ctxt.IsAsm {
+ flags |= goobj2.ObjFlagFromAssembly
+ }
h := goobj2.Header{
Magic: goobj2.Magic,
Fingerprint: ctxt.Fingerprint,
if d.ldr.SymGoType(idx) == 0 {
continue
}
-
- sn := d.ldr.SymName(idx)
- if ctxt.LinkMode != LinkExternal && isStaticTemp(sn) {
+ // Skip file local symbols (this includes static tmps, stack
+ // object symbols, and local symbols in assembler src files).
+ if d.ldr.IsFileLocal(idx) {
continue
}
+ sn := d.ldr.SymName(idx)
if sn == "" {
// skip aux symbols
continue
return false
}
// FIXME: avoid having to do name inspections here.
+ // NB: the restrictions below on file local symbols are a bit
+ // arbitrary -- if it turns out we need nameless static
+ // symbols they could be relaxed/removed.
sn := ldr.SymName(s)
+ if (sn == "" || sn[0] == '.') && ldr.IsFileLocal(s) {
+ panic(fmt.Sprintf("unexpected file local symbol %d %s<%d>\n",
+ s, sn, ldr.SymVersion(s)))
+ }
if (sn == "" || sn[0] == '.') && !ldr.IsFileLocal(s) {
return false
}
nsym := loader.Sym(ldr.NSym())
symGroupType := make([]sym.SymKind, nsym)
for s := loader.Sym(1); s < nsym; s++ {
- name := ldr.SymName(s)
- if !ctxt.IsExternal() && isStaticTemp(name) {
+ if !ctxt.IsExternal() && ldr.IsFileLocal(s) && !ldr.IsFromAssembly(s) {
ldr.SetAttrNotInSymbolTable(s, true)
}
-
if !ldr.AttrReachable(s) || ldr.AttrSpecial(s) || (ldr.SymType(s) != sym.SRODATA && ldr.SymType(s) != sym.SGOFUNC) {
continue
}
+ name := ldr.SymName(s)
switch {
case strings.HasPrefix(name, "type."):
if !ctxt.DynlinkingGo() {
}
return symGroupType
}
-
-func isStaticTemp(name string) bool {
- if i := strings.LastIndex(name, "/"); i >= 0 {
- name = name[i:]
- }
- return strings.Contains(name, "..stmp_")
-}
return int(abiToVer(r.Sym(li).ABI(), r.version))
}
-func (l *Loader) IsFileLocal(i Sym) bool { return l.SymVersion(i) >= sym.SymVerStatic }
+func (l *Loader) IsFileLocal(i Sym) bool {
+ return l.SymVersion(i) >= sym.SymVerStatic
+}
+
+// IsFromAssembly returns true if this symbol is derived from an
+// object file generated by the Go assembler.
+func (l *Loader) IsFromAssembly(i Sym) bool {
+ if l.IsExternal(i) {
+ return false
+ }
+ r, _ := l.toLocal(i)
+ return r.FromAssembly()
+}
// Returns the type of the i-th symbol.
func (l *Loader) SymType(i Sym) sym.SymKind {