]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.link] cmd/link: avoid reading symbol Data in archreloc on ARM64
authorCherry Zhang <cherryyz@google.com>
Tue, 21 Jul 2020 21:59:48 +0000 (17:59 -0400)
committerCherry Zhang <cherryyz@google.com>
Thu, 23 Jul 2020 16:38:27 +0000 (16:38 +0000)
The previous CL changed it to drop the Data when writing out a
symbol. Don't read the data.

Fix ARM64 build.

Change-Id: I121e9b0ebef123dbbc4ddffc02bf1a42788532f4
Reviewed-on: https://go-review.googlesource.com/c/go/+/244038
Reviewed-by: Jeremy Faller <jeremy@golang.org>
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/cmd/link/internal/arm64/asm.go

index 093aadb3435ba309de7cf1f8a0b36e479622a940..ef375a5db4127a47cafb31c54cadaa2022b687cb 100644 (file)
@@ -605,8 +605,7 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade
                return val | ((t >> 2) & 0x03ffffff), noExtReloc, true
 
        case objabi.R_ARM64_GOT:
-               sData := ldr.Data(s)
-               if sData[r.Off()+3]&0x9f == 0x90 {
+               if (val>>24)&0x9f == 0x90 {
                        // R_AARCH64_ADR_GOT_PAGE
                        // patch instruction: adrp
                        t := ldr.SymAddr(rs) + r.Add() - ((ldr.SymValue(s) + int64(r.Off())) &^ 0xfff)
@@ -616,7 +615,7 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade
                        var o0 uint32
                        o0 |= (uint32((t>>12)&3) << 29) | (uint32((t>>12>>2)&0x7ffff) << 5)
                        return val | int64(o0), noExtReloc, isOk
-               } else if sData[r.Off()+3] == 0xf9 {
+               } else if val>>24 == 0xf9 {
                        // R_AARCH64_LD64_GOT_LO12_NC
                        // patch instruction: ldr
                        t := ldr.SymAddr(rs) + r.Add() - ((ldr.SymValue(s) + int64(r.Off())) &^ 0xfff)
@@ -627,12 +626,11 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade
                        o1 |= uint32(t&0xfff) << (10 - 3)
                        return val | int64(uint64(o1)), noExtReloc, isOk
                } else {
-                       ldr.Errorf(s, "unsupported instruction for %v R_GOTARM64", sData[r.Off():r.Off()+4])
+                       ldr.Errorf(s, "unsupported instruction for %x R_GOTARM64", val)
                }
 
        case objabi.R_ARM64_PCREL:
-               sData := ldr.Data(s)
-               if sData[r.Off()+3]&0x9f == 0x90 {
+               if (val>>24)&0x9f == 0x90 {
                        // R_AARCH64_ADR_PREL_PG_HI21
                        // patch instruction: adrp
                        t := ldr.SymAddr(rs) + r.Add() - ((ldr.SymValue(s) + int64(r.Off())) &^ 0xfff)
@@ -641,14 +639,14 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade
                        }
                        o0 := (uint32((t>>12)&3) << 29) | (uint32((t>>12>>2)&0x7ffff) << 5)
                        return val | int64(o0), noExtReloc, isOk
-               } else if sData[r.Off()+3]&0x91 == 0x91 {
+               } else if (val>>24)&0x91 == 0x91 {
                        // R_AARCH64_ADD_ABS_LO12_NC
                        // patch instruction: add
                        t := ldr.SymAddr(rs) + r.Add() - ((ldr.SymValue(s) + int64(r.Off())) &^ 0xfff)
                        o1 := uint32(t&0xfff) << 10
                        return val | int64(o1), noExtReloc, isOk
                } else {
-                       ldr.Errorf(s, "unsupported instruction for %v R_PCRELARM64", sData[r.Off():r.Off()+4])
+                       ldr.Errorf(s, "unsupported instruction for %x R_PCRELARM64", val)
                }
 
        case objabi.R_ARM64_LDST8: