}
type ElfSect struct {
- name string
- nameoff uint32
- type_ uint32
- flags uint64
- addr uint64
- off uint64
- size uint64
- link uint32
- info uint32
- align uint64
- entsize uint64
- base []byte
- sym loader.Sym
+ name string
+ nameoff uint32
+ type_ uint32
+ flags uint64
+ addr uint64
+ off uint64
+ size uint64
+ link uint32
+ info uint32
+ align uint64
+ entsize uint64
+ base []byte
+ readOnlyMem bool // Is this section in readonly memory?
+ sym loader.Sym
}
type ElfObj struct {
sect := &elfobj.sect[i]
if is64 != 0 {
var b ElfSectBytes64
-
if err := binary.Read(f, e, &b); err != nil {
return errorf("malformed elf file: %v", err)
}
sb.SetSize(int64(sect.size))
sb.SetAlign(int32(sect.align))
+ sb.SetReadOnly(sect.readOnlyMem)
sect.sym = sb.Sym()
}
return err
}
- sect.base = make([]byte, sect.size)
elfobj.f.MustSeek(int64(uint64(elfobj.base)+sect.off), 0)
- if _, err := io.ReadFull(elfobj.f, sect.base); err != nil {
+ sect.base, sect.readOnlyMem, err = elfobj.f.Slice(uint64(sect.size))
+ if err != nil {
return fmt.Errorf("short read: %v", err)
}