1
1
mirror of https://github.com/rui314/mold.git synced 2024-09-11 13:06:59 +03:00

Fix support for R_RISCV_SET_ULEB128 and R_RISCV_SUB_ULEB128

Handle allocated sections and write the full value into the location.

Signed-off-by: Andreas Schwab <schwab@suse.de>
This commit is contained in:
Andreas Schwab 2023-07-03 11:29:24 +02:00
parent b04aba89d3
commit 1ac5fe7c1e

View File

@ -127,6 +127,7 @@ static void overwrite_uleb(u8 *loc, u64 val) {
*loc++ = 0b1000'0000 | (val & 0b0111'1111);
val >>= 7;
}
*loc = val & 0b0111'1111;
}
// Returns the rd register of an R/I/U/J-type instruction.
@ -527,6 +528,15 @@ void InputSection<E>::apply_reloc_alloc(Context<E> &ctx, u8 *base) {
case R_RISCV_32_PCREL:
*(U32<E> *)loc = S + A - P;
break;
case R_RISCV_SET_ULEB128:
overwrite_uleb(loc, S + A);
break;
case R_RISCV_SUB_ULEB128: {
u8 *p = loc;
u64 val = read_uleb(p);
overwrite_uleb(loc, val - (S + A));
break;
}
default:
unreachable();
}
@ -726,6 +736,8 @@ void InputSection<E>::scan_relocations(Context<E> &ctx) {
case R_RISCV_SET8:
case R_RISCV_SET16:
case R_RISCV_SET32:
case R_RISCV_SET_ULEB128:
case R_RISCV_SUB_ULEB128:
break;
default:
Error(ctx) << *this << ": unknown relocation: " << rel;