[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>
Fri, 17 Feb 2023 11:57:29 +0000 (11:57 +0000)
commit6f33feb0b38bdd00441e82aaa03f0ea2f914cd5f
treebc0a3b383514093650cde96cd8a2d67f0cefb91c
parentbb29430eed82eda635fac9389ad188375a3f7b7c
[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