//
// Header struct {
// Magic [...]byte // "\x00go114LD"
+// Flags uint32
// // TODO: Fingerprint
// Offsets [...]uint32 // byte offset of each block below
// }
// TODO: probably no need to export this.
type Header struct {
Magic string
+ Flags uint32
Offsets [NBlk]uint32
}
func (h *Header) Write(w *Writer) {
w.RawString(h.Magic)
+ w.Uint32(h.Flags)
for _, x := range h.Offsets {
w.Uint32(x)
}
return errors.New("wrong magic, not a Go object file")
}
off := uint32(len(h.Magic))
+ h.Flags = r.uint32At(off)
+ off += 4
for i := range h.Offsets {
h.Offsets[i] = r.uint32At(off)
off += 4
}
func (h *Header) Size() int {
- return len(h.Magic) + 4*len(h.Offsets)
+ return len(h.Magic) + 4 + 4*len(h.Offsets)
}
// Symbol definition.
const SymABIstatic = ^uint16(0)
+const (
+ ObjFlagShared = 1 << iota
+)
+
const (
SymFlagDupok = 1 << iota
SymFlagLocal
SymFlagLeaf
SymFlagCFunc
SymFlagReflectMethod
- SymFlagShared // This is really silly
SymFlagTopFrame
)
func (s *Sym) Leaf() bool { return s.Flag&SymFlagLeaf != 0 }
func (s *Sym) CFunc() bool { return s.Flag&SymFlagCFunc != 0 }
func (s *Sym) ReflectMethod() bool { return s.Flag&SymFlagReflectMethod != 0 }
-func (s *Sym) Shared() bool { return s.Flag&SymFlagShared != 0 }
func (s *Sym) TopFrame() bool { return s.Flag&SymFlagTopFrame != 0 }
// Symbol reference.
func (r *Reader) ReadOnly() bool {
return r.readonly
}
+
+// Flags returns the flag bits read from the object file header.
+func (r *Reader) Flags() uint32 {
+ return r.h.Flags
+}
// Header
// We just reserve the space. We'll fill in the offsets later.
- h := goobj2.Header{Magic: goobj2.Magic}
+ flags := uint32(0)
+ if ctxt.Flag_shared {
+ flags |= goobj2.ObjFlagShared
+ }
+ h := goobj2.Header{Magic: goobj2.Magic, Flags: flags}
h.Write(w.Writer)
// String table
if s.ReflectMethod() {
flag |= goobj2.SymFlagReflectMethod
}
- if w.ctxt.Flag_shared { // This is really silly
- flag |= goobj2.SymFlagShared
- }
if s.TopFrame() {
flag |= goobj2.SymFlagTopFrame
}
type oReader struct {
*goobj2.Reader
unit *sym.CompilationUnit
- version int // version of static symbol
+ version int // version of static symbol
+ flags uint32 // read from object file
pkgprefix string
}
}
localSymVersion := syms.IncVersion()
pkgprefix := objabi.PathToPrefix(lib.Pkg) + "."
- or := &oReader{r, unit, localSymVersion, pkgprefix}
+ or := &oReader{r, unit, localSymVersion, r.Flags(), pkgprefix}
// Autolib
lib.ImportStrings = append(lib.ImportStrings, r.Autolib()...)
if osym.ReflectMethod() {
s.Attr |= sym.AttrReflectMethod
}
- if osym.Shared() {
+ if r.Flags()&goobj2.ObjFlagShared != 0 {
s.Attr |= sym.AttrShared
}
if osym.TopFrame() {