[PATCH] [MC][ELF] Work around R_MIPS_LO16 relocation handling problem
authorDimitry Andric <dimitry@andric.com>
Mon, 3 May 2021 18:08:49 +0000 (20:08 +0200)
committerSylvestre Ledru <sylvestre@debian.org>
Sat, 29 Jan 2022 09:17:38 +0000 (09:17 +0000)
commit509cfa6de9cfdef450de5e8efc8fd3dfcebddba3
tree38e0004f53acf643805763dc19beaba68291231d
parenta7fc0dcef1b08ae489c13b38622ce68db6963799
[PATCH] [MC][ELF] Work around R_MIPS_LO16 relocation handling problem

This fixes PR49821, and avoids "ld.lld: error: test.o:(.rodata.str1.1):
offset is outside the section" errors when linking MIPS objects with
negative R_MIPS_LO16 implicit addends.

ld.lld handles R_MIPS_HI16/R_MIPS_LO16 separately, not as a whole, so it
doesn't know that an R_MIPS_HI16 with implicit addend 1 and an
R_MIPS_LO16 with implicit addend -32768 represents 32768, which is in
range of a MergeInputSection. We could introduce a new RelExpr member
(like R_RISCV_PC_INDIRECT for R_RISCV_PCREL_HI20 / R_RISCV_PCREL_LO12)
but the complexity is unnecessary given that GNU as keeps the original
symbol for this case as well.

Reviewed By: atanasyan, MaskRay

Differential Revision: https://reviews.llvm.org/D101773

Gbp-Pq: Topic mips
Gbp-Pq: Name mips-D101773-reloc.patch
llvm/lib/MC/ELFObjectWriter.cpp