aarch64: Fix negative movrel offsets for windows

On windows, the offset for the relocation doesn't get stored in
the relocation itself, but as an unsigned immediate in the opcode.
Therefore, negative offsets has to be handled via a separate sub
instruction, just as on MachO.

Signed-off-by: Martin Storsjö <martin@martin.st>
This commit is contained in:
Martin Storsjö 2017-07-09 23:52:10 +03:00
parent 0c99b900d8
commit 7b7760ad6e
1 changed files with 9 additions and 0 deletions

View File

@ -82,6 +82,15 @@ ELF .size \name, . - \name
adrp \rd, \val+(\offset)@PAGE adrp \rd, \val+(\offset)@PAGE
add \rd, \rd, \val+(\offset)@PAGEOFF add \rd, \rd, \val+(\offset)@PAGEOFF
.endif .endif
#elif CONFIG_PIC && defined(_WIN32)
.if \offset < 0
adrp \rd, \val
add \rd, \rd, :lo12:\val
sub \rd, \rd, -(\offset)
.else
adrp \rd, \val+(\offset)
add \rd, \rd, :lo12:\val+(\offset)
.endif
#elif CONFIG_PIC #elif CONFIG_PIC
adrp \rd, \val+(\offset) adrp \rd, \val+(\offset)
add \rd, \rd, :lo12:\val+(\offset) add \rd, \rd, :lo12:\val+(\offset)