[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)
committerGianfranco Costamagna <locutusofborg@debian.org>
Sun, 4 Dec 2022 08:03:06 +0000 (08:03 +0000)
commit6408b00f1cf966645e69b379601e27b15ab1c0e1
tree4c0929bc3189e2bfd73370277425c05a134cb2f0
parent1f6bc51819810ac412412cf0f7220f658574d59a
[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