Skip to content

Commit 66e6bdd

Browse files
committed
Add some missing reloc types
1 parent c4e64df commit 66e6bdd

File tree

1 file changed

+86
-5
lines changed

1 file changed

+86
-5
lines changed

librz/bin/p/bin_elf.inc

Lines changed: 86 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1032,6 +1032,19 @@ static void patch_reloc_hexagon(RZ_INOUT RzBuffer *buf_patched, const ut64 patch
10321032
#define ADR_IMM_MASK2 (((1U << 19) - 1) << 5)
10331033
#define ADR_IMM_MASK3 (((1U << 19) - 1) << 2)
10341034

1035+
/**
1036+
* \brief Patches relocation type of relocation entries.
1037+
*
1038+
* NOTE: Some relocation symbols (e.g. TLS, G) are not yet implemented and are set to 0.
1039+
* TODO: Implement remaining relocation symbols.
1040+
*
1041+
* \param obj The ELF object.
1042+
* \param rel The relocation entry.
1043+
* \param S The symbol value.
1044+
* \param B The base address.
1045+
* \param L The load address.
1046+
* \param GOT The Global Offset Table address.
1047+
*/
10351048
static void patch_reloc(struct Elf_(rz_bin_elf_obj_t) * obj, RzBinElfReloc *rel, ut64 S, ut64 B, ut64 L, ut64 GOT) {
10361049
ut16 e_machine = obj->ehdr.e_machine;
10371050
ut64 val = 0;
@@ -1227,14 +1240,76 @@ static void patch_reloc(struct Elf_(rz_bin_elf_obj_t) * obj, RzBinElfReloc *rel,
12271240
break;
12281241
}
12291242
case EM_386:
1243+
int word = 0;
12301244
switch (rel->type) {
1245+
case RZ_386_8:
1246+
word = 1;
1247+
val = S + A;
1248+
break;
1249+
case RZ_386_16:
1250+
word = 2;
1251+
val = S + A;
1252+
break;
12311253
case RZ_386_32:
1254+
word = 4;
1255+
val = S + A;
1256+
break;
12321257
case RZ_386_PC32:
1233-
rz_buf_read_at(obj->buf_patched, patch_addr, buf, 4);
1234-
val = rz_read_le32(buf) + S + A;
1235-
if (rel->type == RZ_386_PC32) {
1236-
val -= P;
1237-
}
1258+
word = 4;
1259+
val = S + A - P;
1260+
break;
1261+
case RZ_386_PLT32:
1262+
word = 4;
1263+
val = L + A - P;
1264+
break;
1265+
case RZ_386_GLOB_DAT:
1266+
word = 4;
1267+
val = S;
1268+
break;
1269+
case RZ_386_JMP_SLOT:
1270+
word = 4;
1271+
val = S;
1272+
break;
1273+
case RZ_386_RELATIVE:
1274+
word = 4;
1275+
val = B + A;
1276+
break;
1277+
case RZ_386_GOTOFF:
1278+
word = 4;
1279+
val = S + A - GOT;
1280+
break;
1281+
case RZ_386_GOTPC:
1282+
word = 4;
1283+
val = GOT + A - P;
1284+
break;
1285+
case RZ_386_32PLT:
1286+
word = 4;
1287+
val = L + A;
1288+
break;
1289+
case RZ_386_PC8:
1290+
word = 1;
1291+
val = S + A - P;
1292+
break;
1293+
case RZ_386_PC16:
1294+
word = 2;
1295+
val = S + A - P;
1296+
break;
1297+
default:
1298+
break;
1299+
}
1300+
break;
1301+
switch (word) {
1302+
case 0:
1303+
break;
1304+
case 1:
1305+
buf[0] = val;
1306+
rz_buf_write_at(obj->buf_patched, patch_addr, buf, 1);
1307+
break;
1308+
case 2:
1309+
rz_write_le16(buf, val);
1310+
rz_buf_write_at(obj->buf_patched, patch_addr, buf, 2);
1311+
break;
1312+
case 4:
12381313
rz_write_le32(buf, val);
12391314
rz_buf_write_at(obj->buf_patched, patch_addr, buf, 4);
12401315
default:
@@ -1253,6 +1328,9 @@ static void patch_reloc(struct Elf_(rz_bin_elf_obj_t) * obj, RzBinElfReloc *rel,
12531328
val = S + A;
12541329
break;
12551330
case RZ_X86_64_32:
1331+
word = 4;
1332+
val = S + A;
1333+
break;
12561334
case RZ_X86_64_32S:
12571335
word = 4;
12581336
val = S + A;
@@ -1262,6 +1340,9 @@ static void patch_reloc(struct Elf_(rz_bin_elf_obj_t) * obj, RzBinElfReloc *rel,
12621340
val = S + A;
12631341
break;
12641342
case RZ_X86_64_GLOB_DAT:
1343+
word = 8;
1344+
val = S;
1345+
break;
12651346
case RZ_X86_64_JUMP_SLOT:
12661347
word = 4;
12671348
val = S;

0 commit comments

Comments
 (0)