Index: lld/trunk/ELF/InputSection.cpp =================================================================== --- lld/trunk/ELF/InputSection.cpp +++ lld/trunk/ELF/InputSection.cpp @@ -838,7 +838,7 @@ if (Expr == R_NONE) continue; - if (Expr != R_ABS && Expr != R_DTPREL) { + if (Expr != R_ABS && Expr != R_DTPREL && Expr != R_RISCV_ADD) { std::string Msg = getLocation(Offset) + ": has non-ABS relocation " + toString(Type) + " against symbol '" + toString(Sym) + "'"; Index: lld/trunk/test/ELF/riscv-reloc-add.s =================================================================== --- lld/trunk/test/ELF/riscv-reloc-add.s +++ lld/trunk/test/ELF/riscv-reloc-add.s @@ -24,3 +24,9 @@ .word .L1 - .L0 .half .L1 - .L0 .byte .L1 - .L0 + +## Debug section may use R_RISCV_ADD64/R_RISCV_SUB64 pairs to measure lengths +## of code ranges (e.g. DW_AT_high_pc). Check we allow R_RISCV_ADD*/R_RISCV_SUB* +## in such non-SHF_ALLOC sections in -pie/-shared mode. +.section .debug_info +.quad .L1 - .L0