From ea708dc94cf35ce73f66de9c05fee66d30615c4d Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Tue, 21 Jul 2020 17:59:48 -0400 Subject: [PATCH] [dev.link] cmd/link: avoid reading symbol Data in archreloc on ARM64 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 Run-TryBot: Cherry Zhang TryBot-Result: Gobot Gobot --- src/cmd/link/internal/arm64/asm.go | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/cmd/link/internal/arm64/asm.go b/src/cmd/link/internal/arm64/asm.go index 093aadb343..ef375a5db4 100644 --- a/src/cmd/link/internal/arm64/asm.go +++ b/src/cmd/link/internal/arm64/asm.go @@ -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: -- 2.50.0