]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.link] cmd/link: use RO memory (when avail) in elf loader
authorJeremy Faller <jeremy@golang.org>
Thu, 13 Feb 2020 15:38:33 +0000 (10:38 -0500)
committerJeremy Faller <jeremy@golang.org>
Tue, 18 Feb 2020 15:48:03 +0000 (15:48 +0000)
Recreation of CL 206139 in the new symbol hierarchy.

Change-Id: Ic20c5c1b5db8f7eadf4c6ee4638e3c1a4e10ef3a
Reviewed-on: https://go-review.googlesource.com/c/go/+/219317
Run-TryBot: Jeremy Faller <jeremy@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
src/cmd/link/internal/amd64/asm.go
src/cmd/link/internal/loadelf/ldelf.go

index 0f0dcc4f423e2f92bbf237b6319de3c4d606d334..f6b13c4abc166ee1b66426fec3d5f32d1639ebae 100644 (file)
@@ -158,6 +158,7 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
                if targ.Type != sym.SDYNIMPORT {
                        // have symbol
                        if r.Off >= 2 && s.P[r.Off-2] == 0x8b {
+                               makeWritable(s)
                                // turn MOVQ of GOT entry into LEAQ of symbol itself
                                s.P[r.Off-2] = 0x8d
 
index d3cf4aed7b3e917f0d5b4609e726c0412481dd1a..2eabefd4fb9e2d7ee57acdca682fedcf35e6a07b 100644 (file)
@@ -270,19 +270,20 @@ type ElfSymBytes64 struct {
 }
 
 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 {
@@ -600,7 +601,6 @@ func Load(l *loader.Loader, arch *sys.Arch, localSymVersion int, f *bio.Reader,
                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)
                        }
@@ -750,6 +750,7 @@ func Load(l *loader.Loader, arch *sys.Arch, localSymVersion int, f *bio.Reader,
 
                sb.SetSize(int64(sect.size))
                sb.SetAlign(int32(sect.align))
+               sb.SetReadOnly(sect.readOnlyMem)
 
                sect.sym = sb.Sym()
        }
@@ -1016,9 +1017,9 @@ func elfmap(elfobj *ElfObj, sect *ElfSect) (err error) {
                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)
        }