Skip to content

Commit 83f205f

Browse files
4a6f656cbradfitz
authored andcommitted
cmd/link: add support for R_AARCH64_LDST128_ABS_LO12_NC relocations
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 <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Ian Lance Taylor <[email protected]>
1 parent 0926701 commit 83f205f

File tree

4 files changed

+22
-3
lines changed

4 files changed

+22
-3
lines changed

src/cmd/internal/objabi/reloctype.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,9 @@ const (
149149
// R_ARM64_LDST64 sets a LD/ST immediate value to bits [11:3] of a local address.
150150
R_ARM64_LDST64
151151

152+
// R_ARM64_LDST128 sets a LD/ST immediate value to bits [11:4] of a local address.
153+
R_ARM64_LDST128
154+
152155
// PPC64.
153156

154157
// R_POWER_TLS_LE is used to implement the "local exec" model for tls

src/cmd/internal/objabi/reloctype_string.go

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,13 @@ func adddynrel(ctxt *ld.Link, s *sym.Symbol, r *sym.Reloc) bool {
194194
}
195195
r.Type = objabi.R_ARM64_LDST64
196196
return true
197+
198+
case objabi.ElfRelocOffset + objabi.RelocType(elf.R_AARCH64_LDST128_ABS_LO12_NC):
199+
if targ.Type == sym.SDYNIMPORT {
200+
ld.Errorf(s, "unexpected relocation for dynamic symbol %s", targ.Name)
201+
}
202+
r.Type = objabi.R_ARM64_LDST128
203+
return true
197204
}
198205

199206
switch r.Type {
@@ -665,6 +672,14 @@ func archreloc(ctxt *ld.Link, r *sym.Reloc, s *sym.Symbol, val int64) (int64, bo
665672
}
666673
o0 := (uint32(t&0xfff) >> 3) << 10
667674
return val | int64(o0), true
675+
676+
case objabi.R_ARM64_LDST128:
677+
t := ld.Symaddr(r.Sym) + r.Add - ((s.Value + int64(r.Off)) &^ 0xfff)
678+
if t&15 != 0 {
679+
ld.Errorf(s, "invalid address: %x for relocation type: R_AARCH64_LDST128_ABS_LO12_NC", t)
680+
}
681+
o0 := (uint32(t&0xfff) >> 4) << 10
682+
return val | int64(o0), true
668683
}
669684

670685
return val, false

src/cmd/link/internal/loadelf/ldelf.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1179,6 +1179,7 @@ func relSize(arch *sys.Arch, pn string, elftype uint32) (uint8, error) {
11791179
ARM64 | uint32(elf.R_AARCH64_LDST8_ABS_LO12_NC)<<16,
11801180
ARM64 | uint32(elf.R_AARCH64_LDST32_ABS_LO12_NC)<<16,
11811181
ARM64 | uint32(elf.R_AARCH64_LDST64_ABS_LO12_NC)<<16,
1182+
ARM64 | uint32(elf.R_AARCH64_LDST128_ABS_LO12_NC)<<16,
11821183
ARM64 | uint32(elf.R_AARCH64_PREL32)<<16,
11831184
ARM64 | uint32(elf.R_AARCH64_JUMP26)<<16,
11841185
AMD64 | uint32(elf.R_X86_64_PC32)<<16,

0 commit comments

Comments
 (0)