Skip to content

Commit a10e7cb

Browse files
Add relocation conversion for AVR
1 parent d0a0b6e commit a10e7cb

File tree

2 files changed

+86
-1
lines changed

2 files changed

+86
-1
lines changed

librz/bin/format/elf/elf_relocs_conversion.c

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1375,6 +1375,51 @@ static RzBinReloc *reloc_convert_sparc(ELFOBJ *bin, RzBinElfReloc *rel, ut64 GOT
13751375
}
13761376
}
13771377

1378+
static RzBinReloc *reloc_convert_avr(ELFOBJ *bin, RzBinElfReloc *rel, ut64 GOT) {
1379+
switch (rel->type) {
1380+
case R_AVR_NONE:
1381+
return reloc_convert_set(bin, rel, 0, "R_AVR_NONE");
1382+
case R_AVR_32: SET(32, "R_AVR_32");
1383+
case R_AVR_7_PCREL: SET(16, "R_AVR_7_PCREL");
1384+
case R_AVR_13_PCREL: SET(16, "R_AVR_13_PCREL");
1385+
case R_AVR_16: SET(16, "R_AVR_16");
1386+
case R_AVR_16_PM: SET(16, "R_AVR_16_PM");
1387+
case R_AVR_LO8_LDI: SET(16, "R_AVR_LO8_LDI");
1388+
case R_AVR_HI8_LDI: SET(16, "R_AVR_HI8_LDI");
1389+
case R_AVR_HH8_LDI: SET(16, "R_AVR_HH8_LDI");
1390+
case R_AVR_LO8_LDI_NEG: SET(16, "R_AVR_LO8_LDI_NEG");
1391+
case R_AVR_HI8_LDI_NEG: SET(16, "R_AVR_HI8_LDI_NEG");
1392+
case R_AVR_HH8_LDI_NEG: SET(16, "R_AVR_HH8_LDI_NEG");
1393+
case R_AVR_LO8_LDI_PM: SET(16, "R_AVR_LO8_LDI_PM");
1394+
case R_AVR_HI8_LDI_PM: SET(16, "R_AVR_HI8_LDI_PM");
1395+
case R_AVR_HH8_LDI_PM: SET(16, "R_AVR_HH8_LDI_PM");
1396+
case R_AVR_LO8_LDI_PM_NEG: SET(16, "R_AVR_LO8_LDI_PM_NEG");
1397+
case R_AVR_HI8_LDI_PM_NEG: SET(16, "R_AVR_HI8_LDI_PM_NEG");
1398+
case R_AVR_HH8_LDI_PM_NEG: SET(16, "R_AVR_HH8_LDI_PM_NEG");
1399+
case R_AVR_CALL: SET(32, "R_AVR_CALL");
1400+
case R_AVR_LDI:
1401+
return reloc_convert_set(bin, rel, 0, "R_AVR_LDI");
1402+
case R_AVR_6: SET(16, "R_AVR_6");
1403+
case R_AVR_6_ADIW: SET(16, "R_AVR_6_ADIW");
1404+
case R_AVR_MS8_LDI: SET(16, "R_AVR_MS8_LDI");
1405+
case R_AVR_MS8_LDI_NEG: SET(16, "R_AVR_MS8_LDI_NEG");
1406+
case R_AVR_LO8_LDI_GS: SET(16, "R_AVR_LO8_LDI_GS");
1407+
case R_AVR_HI8_LDI_GS: SET(16, "R_AVR_HI8_LDI_GS");
1408+
case R_AVR_8: SET(8, "R_AVR_8");
1409+
case R_AVR_8_LO8: SET(8, "R_AVR_8_LO8");
1410+
case R_AVR_8_HI8: SET(8, "R_AVR_8_HI8");
1411+
case R_AVR_8_HLO8: SET(8, "R_AVR_8_HLO8");
1412+
case R_AVR_DIFF8: SET(8, "R_AVR_DIFF8");
1413+
case R_AVR_DIFF16: SET(16, "R_AVR_DIFF16");
1414+
case R_AVR_DIFF32: SET(32, "R_AVR_DIFF32");
1415+
case R_AVR_LDS_STS_16: SET(16, "R_AVR_LDS_STS_16");
1416+
case R_AVR_PORT6: SET(16, "R_AVR_PORT6");
1417+
case R_AVR_PORT5: SET(16, "R_AVR_PORT5");
1418+
case R_AVR_32_PCREL: SET(32, "R_AVR_32_PCREL");
1419+
default: UNSUPP("AVR");
1420+
}
1421+
}
1422+
13781423
#undef UNSUPP
13791424
#undef UNHANDL
13801425
#undef SET
@@ -1424,6 +1469,8 @@ RZ_OWN RzBinReloc *Elf_(rz_bin_elf_convert_relocation)(RZ_NONNULL ELFOBJ *bin, R
14241469
return reloc_convert_mips(bin, rel, GOT);
14251470
case EM_IMG1: // nanomips
14261471
return reloc_convert_nanomips(bin, rel, GOT);
1472+
case EM_AVR:
1473+
return reloc_convert_avr(bin, rel, GOT);
14271474
case EM_M32: ARCH_MISSING("EM_M32");
14281475
case EM_68K: ARCH_MISSING("EM_68K");
14291476
case EM_88K: ARCH_MISSING("EM_88K");
@@ -1478,7 +1525,6 @@ RZ_OWN RzBinReloc *Elf_(rz_bin_elf_convert_relocation)(RZ_NONNULL ELFOBJ *bin, R
14781525
case EM_MMIX: ARCH_MISSING("EM_MMIX");
14791526
case EM_HUANY: ARCH_MISSING("EM_HUANY");
14801527
case EM_PRISM: ARCH_MISSING("EM_PRISM");
1481-
case EM_AVR: ARCH_MISSING("EM_AVR");
14821528
case EM_FR30: ARCH_MISSING("EM_FR30");
14831529
case EM_D10V: ARCH_MISSING("EM_D10V");
14841530
case EM_D30V: ARCH_MISSING("EM_D30V");

librz/bin/format/elf/glibc_elf.h

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4369,6 +4369,45 @@ ARM32 relocations:
43694369
#define R_SPARC_BITMASK_SIMM13 0x00001fff
43704370
#define R_SPARC_BITMASK_SIMM22 0x003fffff
43714371

4372+
/* AVR Relocations */
4373+
#define R_AVR_NONE 0
4374+
#define R_AVR_32 1
4375+
#define R_AVR_7_PCREL 2
4376+
#define R_AVR_13_PCREL 3
4377+
#define R_AVR_16 4
4378+
#define R_AVR_16_PM 5
4379+
#define R_AVR_LO8_LDI 6
4380+
#define R_AVR_HI8_LDI 7
4381+
#define R_AVR_HH8_LDI 8
4382+
#define R_AVR_LO8_LDI_NEG 9
4383+
#define R_AVR_HI8_LDI_NEG 10
4384+
#define R_AVR_HH8_LDI_NEG 11
4385+
#define R_AVR_LO8_LDI_PM 12
4386+
#define R_AVR_HI8_LDI_PM 13
4387+
#define R_AVR_HH8_LDI_PM 14
4388+
#define R_AVR_LO8_LDI_PM_NEG 15
4389+
#define R_AVR_HI8_LDI_PM_NEG 16
4390+
#define R_AVR_HH8_LDI_PM_NEG 17
4391+
#define R_AVR_CALL 18
4392+
#define R_AVR_LDI 19
4393+
#define R_AVR_6 20
4394+
#define R_AVR_6_ADIW 21
4395+
#define R_AVR_MS8_LDI 22
4396+
#define R_AVR_MS8_LDI_NEG 23
4397+
#define R_AVR_LO8_LDI_GS 24
4398+
#define R_AVR_HI8_LDI_GS 25
4399+
#define R_AVR_8 26
4400+
#define R_AVR_8_LO8 27
4401+
#define R_AVR_8_HI8 28
4402+
#define R_AVR_8_HLO8 29
4403+
#define R_AVR_DIFF8 30
4404+
#define R_AVR_DIFF16 31
4405+
#define R_AVR_DIFF32 32
4406+
#define R_AVR_LDS_STS_16 33
4407+
#define R_AVR_PORT6 34
4408+
#define R_AVR_PORT5 35
4409+
#define R_AVR_32_PCREL 36
4410+
43724411
/* Dynamic array tags */
43734412

43744413
#define DT_HEXAGON_SYMSZ 0x70000000

0 commit comments

Comments
 (0)