@@ -1032,6 +1032,19 @@ static void patch_reloc_hexagon(RZ_INOUT RzBuffer *buf_patched, const ut64 patch
1032
1032
#define ADR_IMM_MASK2 (((1U << 19 ) - 1 ) << 5 )
1033
1033
#define ADR_IMM_MASK3 (((1U << 19 ) - 1 ) << 2 )
1034
1034
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
+ */
1035
1048
static void patch_reloc (struct Elf_ (rz_bin_elf_obj_t ) * obj, RzBinElfReloc *rel, ut64 S, ut64 B, ut64 L, ut64 GOT) {
1036
1049
ut16 e_machine = obj->ehdr .e_machine ;
1037
1050
ut64 val = 0 ;
@@ -1227,14 +1240,76 @@ static void patch_reloc(struct Elf_(rz_bin_elf_obj_t) * obj, RzBinElfReloc *rel,
1227
1240
break ;
1228
1241
}
1229
1242
case EM_386:
1243
+ int word = 0 ;
1230
1244
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 ;
1231
1253
case RZ_386_32:
1254
+ word = 4 ;
1255
+ val = S + A;
1256
+ break ;
1232
1257
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 :
1238
1313
rz_write_le32 (buf, val);
1239
1314
rz_buf_write_at (obj->buf_patched , patch_addr, buf, 4 );
1240
1315
default :
@@ -1253,6 +1328,9 @@ static void patch_reloc(struct Elf_(rz_bin_elf_obj_t) * obj, RzBinElfReloc *rel,
1253
1328
val = S + A;
1254
1329
break ;
1255
1330
case RZ_X86_64_32:
1331
+ word = 4 ;
1332
+ val = S + A;
1333
+ break ;
1256
1334
case RZ_X86_64_32S:
1257
1335
word = 4 ;
1258
1336
val = S + A;
@@ -1262,6 +1340,9 @@ static void patch_reloc(struct Elf_(rz_bin_elf_obj_t) * obj, RzBinElfReloc *rel,
1262
1340
val = S + A;
1263
1341
break ;
1264
1342
case RZ_X86_64_GLOB_DAT:
1343
+ word = 8 ;
1344
+ val = S;
1345
+ break ;
1265
1346
case RZ_X86_64_JUMP_SLOT:
1266
1347
word = 4 ;
1267
1348
val = S;
0 commit comments