]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: add support for R_AARCH64_LDST128_ABS_LO12_NC relocations
authorJoel Sing <joel@sing.id.au>
Fri, 10 May 2019 16:21:22 +0000 (02:21 +1000)
committerBrad Fitzpatrick <bradfitz@golang.org>
Sun, 12 May 2019 02:55:19 +0000 (02:55 +0000)
These are encountered when compiling with -linkmode=internal on openbsd/arm64.

Fixes #31940

Change-Id: I851e6a7da0a3fb3e23b4fa2ed8dce3051c680f11
Reviewed-on: https://go-review.googlesource.com/c/go/+/176697
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/cmd/internal/objabi/reloctype.go
src/cmd/internal/objabi/reloctype_string.go
src/cmd/link/internal/arm64/asm.go
src/cmd/link/internal/loadelf/ldelf.go

index a28b48ba50cde6fb843c1683eb56693ba6ffaee1..5dc9356fe1786c5e43fa27758af33cb82a6f7fc8 100644 (file)
@@ -149,6 +149,9 @@ const (
        // R_ARM64_LDST64 sets a LD/ST immediate value to bits [11:3] of a local address.
        R_ARM64_LDST64
 
+       // R_ARM64_LDST128 sets a LD/ST immediate value to bits [11:4] of a local address.
+       R_ARM64_LDST128
+
        // PPC64.
 
        // R_POWER_TLS_LE is used to implement the "local exec" model for tls
index bd6d28561722698fb9979cf2819a37b5b6a7df42..a1c4c1aa5189bc392e1e8d145dd78b23284c6edc 100644 (file)
@@ -1,12 +1,12 @@
-// Code generated by "stringer -type RelocType"; DO NOT EDIT.
+// Code generated by "stringer -type=RelocType"; DO NOT EDIT.
 
 package objabi
 
 import "strconv"
 
-const _RelocType_name = "R_ADDRR_ADDRPOWERR_ADDRARM64R_ADDRMIPSR_ADDROFFR_WEAKADDROFFR_SIZER_CALLR_CALLARMR_CALLARM64R_CALLINDR_CALLPOWERR_CALLMIPSR_CONSTR_PCRELR_TLS_LER_TLS_IER_GOTOFFR_PLT0R_PLT1R_PLT2R_USEFIELDR_USETYPER_METHODOFFR_POWER_TOCR_GOTPCRELR_JMPMIPSR_DWARFSECREFR_DWARFFILEREFR_ARM64_TLS_LER_ARM64_TLS_IER_ARM64_GOTPCRELR_ARM64_GOTR_ARM64_PCRELR_ARM64_LDST8R_ARM64_LDST32R_ARM64_LDST64R_POWER_TLS_LER_POWER_TLS_IER_POWER_TLSR_ADDRPOWER_DSR_ADDRPOWER_GOTR_ADDRPOWER_PCRELR_ADDRPOWER_TOCRELR_ADDRPOWER_TOCREL_DSR_PCRELDBLR_ADDRMIPSUR_ADDRMIPSTLSR_ADDRCUOFFR_WASMIMPORTR_XCOFFREF"
+const _RelocType_name = "R_ADDRR_ADDRPOWERR_ADDRARM64R_ADDRMIPSR_ADDROFFR_WEAKADDROFFR_SIZER_CALLR_CALLARMR_CALLARM64R_CALLINDR_CALLPOWERR_CALLMIPSR_CONSTR_PCRELR_TLS_LER_TLS_IER_GOTOFFR_PLT0R_PLT1R_PLT2R_USEFIELDR_USETYPER_METHODOFFR_POWER_TOCR_GOTPCRELR_JMPMIPSR_DWARFSECREFR_DWARFFILEREFR_ARM64_TLS_LER_ARM64_TLS_IER_ARM64_GOTPCRELR_ARM64_GOTR_ARM64_PCRELR_ARM64_LDST8R_ARM64_LDST32R_ARM64_LDST64R_ARM64_LDST128R_POWER_TLS_LER_POWER_TLS_IER_POWER_TLSR_ADDRPOWER_DSR_ADDRPOWER_GOTR_ADDRPOWER_PCRELR_ADDRPOWER_TOCRELR_ADDRPOWER_TOCREL_DSR_PCRELDBLR_ADDRMIPSUR_ADDRMIPSTLSR_ADDRCUOFFR_WASMIMPORTR_XCOFFREF"
 
-var _RelocType_index = [...]uint16{0, 6, 17, 28, 38, 47, 60, 66, 72, 81, 92, 101, 112, 122, 129, 136, 144, 152, 160, 166, 172, 178, 188, 197, 208, 219, 229, 238, 251, 265, 279, 293, 309, 320, 333, 346, 360, 374, 388, 402, 413, 427, 442, 459, 477, 498, 508, 519, 532, 543, 555, 565}
+var _RelocType_index = [...]uint16{0, 6, 17, 28, 38, 47, 60, 66, 72, 81, 92, 101, 112, 122, 129, 136, 144, 152, 160, 166, 172, 178, 188, 197, 208, 219, 229, 238, 251, 265, 279, 293, 309, 320, 333, 346, 360, 374, 389, 403, 417, 428, 442, 457, 474, 492, 513, 523, 534, 547, 558, 570, 580}
 
 func (i RelocType) String() string {
        i -= 1
index c0e69ea02357eaa8d379db1eec3784ffd5f43d6d..e199b2265117e4837df0497027e8464ac1b8ab07 100644 (file)
@@ -194,6 +194,13 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
                }
                r.Type = objabi.R_ARM64_LDST64
                return true
+
+       case objabi.ElfRelocOffset + objabi.RelocType(elf.R_AARCH64_LDST128_ABS_LO12_NC):
+               if targ.Type == sym.SDYNIMPORT {
+                       ld.Errorf(s, "unexpected relocation for dynamic symbol %s", targ.Name)
+               }
+               r.Type = objabi.R_ARM64_LDST128
+               return true
        }
 
        switch r.Type {
@@ -665,6 +672,14 @@ func archreloc(ctxt *ld.Link, r *sym.Reloc, s *sym.Symbol, val int64) (int64, bo
                }
                o0 := (uint32(t&0xfff) >> 3) << 10
                return val | int64(o0), true
+
+       case objabi.R_ARM64_LDST128:
+               t := ld.Symaddr(r.Sym) + r.Add - ((s.Value + int64(r.Off)) &^ 0xfff)
+               if t&15 != 0 {
+                       ld.Errorf(s, "invalid address: %x for relocation type: R_AARCH64_LDST128_ABS_LO12_NC", t)
+               }
+               o0 := (uint32(t&0xfff) >> 4) << 10
+               return val | int64(o0), true
        }
 
        return val, false
index 90505a2342007ab54d2992b19d82bd3adcd700b6..e895056bb2d298e4edd45253dfc3db69953ea89f 100644 (file)
@@ -1179,6 +1179,7 @@ func relSize(arch *sys.Arch, pn string, elftype uint32) (uint8, error) {
                ARM64 | uint32(elf.R_AARCH64_LDST8_ABS_LO12_NC)<<16,
                ARM64 | uint32(elf.R_AARCH64_LDST32_ABS_LO12_NC)<<16,
                ARM64 | uint32(elf.R_AARCH64_LDST64_ABS_LO12_NC)<<16,
+               ARM64 | uint32(elf.R_AARCH64_LDST128_ABS_LO12_NC)<<16,
                ARM64 | uint32(elf.R_AARCH64_PREL32)<<16,
                ARM64 | uint32(elf.R_AARCH64_JUMP26)<<16,
                AMD64 | uint32(elf.R_X86_64_PC32)<<16,