add support for powerpc/powerpc64 unaligned relocations
authorSamuel Holland <samuel@sholland.org>
Sun, 30 Jun 2019 12:39:20 +0000 (07:39 -0500)
committerRich Felker <dalias@aerifal.cx>
Sun, 11 Aug 2019 21:43:57 +0000 (17:43 -0400)
commit08869deb7efbda6e979886cb67e3d5843f92c2e8
tree93547135ee0d59dd87831e8728f9c154e3d8e79e
parent71af5309874269bcc9e4b84ea716fab33d888c1d
add support for powerpc/powerpc64 unaligned relocations

R_PPC_UADDR32 (R_PPC64_UADDR64) has the same meaning as R_PPC_ADDR32
(R_PPC64_ADDR64), except that its address need not be aligned. For
powerpc64, BFD ld(1) will automatically convert between ADDR<->UADDR
relocations when the address is/isn't at its native alignment. This
will happen if, for example, there is a pointer in a packed struct.

gold and lld do not currently generate R_PPC64_UADDR64, but pass
through misaligned R_PPC64_ADDR64 relocations from object files,
possibly relaxing them to misaligned R_PPC64_RELATIVE. In both cases
(relaxed or not) this violates the PSABI, which defines the relevant
field type as "a 64-bit field occupying 8 bytes, the alignment of
which is 8 bytes unless otherwise specified."

All three linkers violate the PSABI on 32-bit powerpc, where the only
difference is that the field is 32 bits wide, aligned to 4 bytes.

Currently musl fails to load executables linked by BFD ld containing
R_PPC64_UADDR64, with the error "unsupported relocation type 43".
This change provides compatibility with BFD ld on powerpc64, and any
static linker on either architecture that starts following the PSABI
more closely.
arch/powerpc/reloc.h
arch/powerpc64/reloc.h
ldso/dynlink.c
src/internal/dynlink.h