Skip to content

Commit fe2891e

Browse files
authored
librz/bin/elf: use a macro that won't be removed in release builds (#5989)
1 parent 5897f30 commit fe2891e

File tree

1 file changed

+35
-27
lines changed

1 file changed

+35
-27
lines changed

librz/bin/format/elf/elf_relocs_patching.c

Lines changed: 35 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2329,6 +2329,12 @@ static const ut16 RISCV_CI_TYPE_IMM_MASK = (1 << 12) | (0x1f << 2);
23292329
i = ((ut32)i); \
23302330
}
23312331

2332+
#define RISCV_CHECK_SUCCESS_RET_IF_FAIL(success, type) \
2333+
if (!success) { \
2334+
RZ_LOG_ERROR("Failed to successfully patch a %s reloc at %llx (S: %llx, A: %llx, B: %llx, P: %llx)", type, patch_addr, S, A, B, P); \
2335+
return; \
2336+
}
2337+
23322338
static void patch_reloc_riscv(RZ_INOUT RzBuffer *buf_patched, const ut64 patch_addr, const int rel_type, bool big_endian, const RelocFormularSymbols *fs, const int bits) {
23332339
rz_return_if_fail(buf_patched && fs);
23342340

@@ -2346,26 +2352,26 @@ static void patch_reloc_riscv(RZ_INOUT RzBuffer *buf_patched, const ut64 patch_a
23462352
case R_RISCV_32: {
23472353
val = S + A;
23482354
bool success = rz_buf_write_ble32_at(buf_patched, patch_addr, val, big_endian);
2349-
rz_return_if_fail(success);
2355+
RISCV_CHECK_SUCCESS_RET_IF_FAIL(success, "R_RISCV_32");
23502356
break;
23512357
}
23522358
case R_RISCV_64: {
23532359
val = S + A;
23542360
bool success = rz_buf_write_ble64_at(buf_patched, patch_addr, val, big_endian);
2355-
rz_return_if_fail(success);
2361+
RISCV_CHECK_SUCCESS_RET_IF_FAIL(success, "R_RISCV_64");
23562362
break;
23572363
}
23582364
case R_RISCV_RELATIVE:
23592365
val = A + B;
23602366
switch (bits) {
23612367
case 32: {
23622368
bool success = rz_buf_write_ble32_at(buf_patched, patch_addr, val, big_endian);
2363-
rz_return_if_fail(success);
2369+
RISCV_CHECK_SUCCESS_RET_IF_FAIL(success, "R_RISCV_RELATIVE 32");
23642370
break;
23652371
}
23662372
case 64: {
23672373
bool success = rz_buf_write_ble64_at(buf_patched, patch_addr, val, big_endian);
2368-
rz_return_if_fail(success);
2374+
RISCV_CHECK_SUCCESS_RET_IF_FAIL(success, "R_RISCV_RELATIVE 64");
23692375
break;
23702376
}
23712377
default:
@@ -2421,12 +2427,12 @@ static void patch_reloc_riscv(RZ_INOUT RzBuffer *buf_patched, const ut64 patch_a
24212427
switch (bits) {
24222428
case 32: {
24232429
bool success = rz_buf_write_ble32_at(buf_patched, patch_addr, S, big_endian);
2424-
rz_return_if_fail(success);
2430+
RISCV_CHECK_SUCCESS_RET_IF_FAIL(success, "R_RISCV_JUMP_SLOT 32");
24252431
break;
24262432
}
24272433
case 64: {
24282434
bool success = rz_buf_write_ble64_at(buf_patched, patch_addr, S, big_endian);
2429-
rz_return_if_fail(success);
2435+
RISCV_CHECK_SUCCESS_RET_IF_FAIL(success, "R_RISCV_JUMP_SLOT 64");
24302436
break;
24312437
}
24322438
default:
@@ -2438,7 +2444,7 @@ static void patch_reloc_riscv(RZ_INOUT RzBuffer *buf_patched, const ut64 patch_a
24382444
case R_RISCV_32_PCREL: {
24392445
val = S + A - P;
24402446
bool success = rz_buf_write_ble32_at(buf_patched, patch_addr, val, big_endian);
2441-
rz_return_if_fail(success);
2447+
RISCV_CHECK_SUCCESS_RET_IF_FAIL(success, "R_RISCV_32_PCREL");
24422448
break;
24432449
}
24442450

@@ -2520,110 +2526,110 @@ static void patch_reloc_riscv(RZ_INOUT RzBuffer *buf_patched, const ut64 patch_a
25202526
ut64 result = ((ut64)old_val) + S + A;
25212527
unsigned long long addr = patch_addr;
25222528
bool success = rz_buf_write_ble8_offset(buf_patched, &addr, (ut8)result, big_endian);
2523-
rz_return_if_fail(success);
2529+
RISCV_CHECK_SUCCESS_RET_IF_FAIL(success, "R_RISCV_ADD8");
25242530
break;
25252531
}
25262532

25272533
case R_RISCV_ADD16: {
25282534
ut16 old_val = 0;
25292535
bool success = rz_buf_read_ble16_at(buf_patched, patch_addr, &old_val, big_endian);
2530-
rz_return_if_fail(success);
2536+
RISCV_CHECK_SUCCESS_RET_IF_FAIL(success, "R_RISCV_ADD16 [r]");
25312537
ut64 result = ((ut64)old_val) + S + A;
25322538
success = rz_buf_write_ble16_at(buf_patched, patch_addr, (ut16)result, big_endian);
2533-
rz_return_if_fail(success);
2539+
RISCV_CHECK_SUCCESS_RET_IF_FAIL(success, "R_RISCV_ADD16 [w]");
25342540
break;
25352541
}
25362542

25372543
case R_RISCV_ADD32: {
25382544
ut32 old_val = 0;
25392545
bool success = rz_buf_read_ble32_at(buf_patched, patch_addr, &old_val, big_endian);
2540-
rz_return_if_fail(success);
2546+
RISCV_CHECK_SUCCESS_RET_IF_FAIL(success, "R_RISCV_ADD32 [r]");
25412547
ut64 result = ((ut64)old_val) + S + A;
25422548
success = rz_buf_write_ble32_at(buf_patched, patch_addr, (ut32)result, big_endian);
2543-
rz_return_if_fail(success);
2549+
RISCV_CHECK_SUCCESS_RET_IF_FAIL(success, "R_RISCV_ADD32 [w]");
25442550
break;
25452551
}
25462552

25472553
case R_RISCV_ADD64: {
25482554
ut64 old_val = 0;
25492555
bool success = rz_buf_read_ble64_at(buf_patched, patch_addr, &old_val, big_endian);
2550-
rz_return_if_fail(success);
2556+
RISCV_CHECK_SUCCESS_RET_IF_FAIL(success, "R_RISCV_ADD64 [r]");
25512557
ut64 result = old_val + S + A;
25522558
success = rz_buf_write_ble64_at(buf_patched, patch_addr, result, big_endian);
2553-
rz_return_if_fail(success);
2559+
RISCV_CHECK_SUCCESS_RET_IF_FAIL(success, "R_RISCV_ADD64 [w]");
25542560
break;
25552561
}
25562562

25572563
case R_RISCV_SUB8: {
25582564
ut8 old_val = 0;
25592565
bool success = rz_buf_read_ble8_at(buf_patched, patch_addr, &old_val, big_endian);
2560-
rz_return_if_fail(success);
2566+
RISCV_CHECK_SUCCESS_RET_IF_FAIL(success, "R_RISCV_SUB8 [r]");
25612567
ut64 result = ((ut64)old_val) - S - A;
25622568
unsigned long long addr = patch_addr;
25632569
success = rz_buf_write_ble8_offset(buf_patched, &addr, (ut8)result, big_endian);
2564-
rz_return_if_fail(success);
2570+
RISCV_CHECK_SUCCESS_RET_IF_FAIL(success, "R_RISCV_SUB8 [w]");
25652571
break;
25662572
}
25672573

25682574
case R_RISCV_SUB16: {
25692575
ut16 old_val = 0;
25702576
bool success = rz_buf_read_ble16_at(buf_patched, patch_addr, &old_val, big_endian);
2571-
rz_return_if_fail(success);
2577+
RISCV_CHECK_SUCCESS_RET_IF_FAIL(success, "R_RISCV_SUB16 [r]");
25722578
ut64 result = ((ut64)old_val) - S - A;
25732579
success = rz_buf_write_ble16_at(buf_patched, patch_addr, (ut16)result, big_endian);
2574-
rz_return_if_fail(success);
2580+
RISCV_CHECK_SUCCESS_RET_IF_FAIL(success, "R_RISCV_SUB16 [w]");
25752581
break;
25762582
}
25772583

25782584
case R_RISCV_SUB32: {
25792585
ut32 old_val = 0;
25802586
bool success = rz_buf_read_ble32_at(buf_patched, patch_addr, &old_val, big_endian);
2581-
rz_return_if_fail(success);
2587+
RISCV_CHECK_SUCCESS_RET_IF_FAIL(success, "R_RISCV_SUB32 [r]");
25822588
ut64 result = ((ut64)old_val) - S - A;
25832589
success = rz_buf_write_ble32_at(buf_patched, patch_addr, (ut32)result, big_endian);
2584-
rz_return_if_fail(success);
2590+
RISCV_CHECK_SUCCESS_RET_IF_FAIL(success, "R_RISCV_SUB32 [w]");
25852591
break;
25862592
}
25872593

25882594
case R_RISCV_SUB64: {
25892595
ut64 old_val = 0;
25902596
bool success = rz_buf_read_ble64_at(buf_patched, patch_addr, &old_val, big_endian);
2591-
rz_return_if_fail(success);
2597+
RISCV_CHECK_SUCCESS_RET_IF_FAIL(success, "R_RISCV_SUB64 [r]");
25922598
ut64 result = ((ut64)old_val) - S - A;
25932599
success = rz_buf_write_ble64_at(buf_patched, patch_addr, result, big_endian);
2594-
rz_return_if_fail(success);
2600+
RISCV_CHECK_SUCCESS_RET_IF_FAIL(success, "R_RISCV_SUB64 [w]");
25952601
break;
25962602
}
25972603

25982604
case R_RISCV_SET8: {
25992605
val = S + A;
26002606
unsigned long long addr = patch_addr;
26012607
bool success = rz_buf_write_ble8_offset(buf_patched, &addr, (ut8)val, big_endian);
2602-
rz_return_if_fail(success);
2608+
RISCV_CHECK_SUCCESS_RET_IF_FAIL(success, "R_RISCV_SET8");
26032609
break;
26042610
}
26052611
case R_RISCV_SET16: {
26062612
val = S + A;
26072613
bool success = rz_buf_write_ble16_at(buf_patched, patch_addr, (ut16)val, big_endian);
2608-
rz_return_if_fail(success);
2614+
RISCV_CHECK_SUCCESS_RET_IF_FAIL(success, "R_RISCV_SET16");
26092615
break;
26102616
}
26112617
case R_RISCV_SET32: {
26122618
val = S + A;
26132619
bool success = rz_buf_write_ble32_at(buf_patched, patch_addr, (ut32)val, big_endian);
2614-
rz_return_if_fail(success);
2620+
RISCV_CHECK_SUCCESS_RET_IF_FAIL(success, "R_RISCV_SET32");
26152621
break;
26162622
}
26172623

26182624
case R_RISCV_SET6:
26192625
case R_RISCV_SUB6: {
26202626
ut8 old_val = 0;
26212627
bool success = rz_buf_read_ble8_at(buf_patched, patch_addr, &old_val, big_endian);
2622-
rz_return_if_fail(success);
2628+
RISCV_CHECK_SUCCESS_RET_IF_FAIL(success, rel_type == R_RISCV_SET6 ? "R_RISCV_SET6 [r]" : "R_RISCV_SUB6 [r]");
26232629
val = S + A;
26242630
ut8 result = (rel_type == R_RISCV_SET6) ? val : ((old_val & 0x3F) - val);
26252631
success = rz_buf_write_ble8_at(buf_patched, patch_addr, (old_val & 0xC0) | (result & 0x3F), big_endian);
2626-
rz_return_if_fail(success);
2632+
RISCV_CHECK_SUCCESS_RET_IF_FAIL(success, rel_type == R_RISCV_SET6 ? "R_RISCV_SET6 [w]" : "R_RISCV_SUB6 [w]");
26272633
break;
26282634
}
26292635

@@ -2674,6 +2680,8 @@ static void patch_reloc_riscv(RZ_INOUT RzBuffer *buf_patched, const ut64 patch_a
26742680
}
26752681
}
26762682

2683+
#undef RISCV_CHECK_SUCCESS_RET_IF_FAIL
2684+
26772685
#undef UNHANDL
26782686
#undef UNHANDL_DEF
26792687

0 commit comments

Comments
 (0)