librz/bin/elf: Add R_PPC64_RELATIVE and R_PPC64_ADDR64. (#6058)
This commit is contained in:
parent
882ca0c6fb
commit
964335bcf6
2 changed files with 17 additions and 2 deletions
|
|
@ -761,7 +761,7 @@ static RzBinReloc *reloc_convert_ppc64(ELFOBJ *bin, RzBinElfReloc *rel, ut64 GOT
|
|||
case R_PPC64_COPY: ADD(64, 0, "R_PPC64_COPY", RZ_RELOC_BASE_UNKNOWN);
|
||||
case R_PPC64_GLOB_DAT: ADD(64, 0, "R_PPC64_GLOB_DAT", RZ_RELOC_BASE_SYMBOL);
|
||||
case R_PPC64_JMP_SLOT: ADD(64, 0, "R_PPC64_JMP_SLOT", RZ_RELOC_BASE_SYMBOL);
|
||||
case R_PPC64_RELATIVE: ADD(64, -P, "R_PPC64_RELATIVE", RZ_RELOC_BASE_BASE);
|
||||
case R_PPC64_RELATIVE: ADD(64, 0, "R_PPC64_RELATIVE", RZ_RELOC_BASE_BASE);
|
||||
case R_PPC64_UADDR32: UNHANDL("R_PPC64_UADDR32");
|
||||
case R_PPC64_UADDR16: UNHANDL("R_PPC64_UADDR16");
|
||||
case R_PPC64_REL32: ADD(32, -P, "R_PPC64_REL32", RZ_RELOC_BASE_SYMBOL);
|
||||
|
|
@ -775,7 +775,7 @@ static RzBinReloc *reloc_convert_ppc64(ELFOBJ *bin, RzBinElfReloc *rel, ut64 GOT
|
|||
case R_PPC64_SECTOFF_HI: UNHANDL("R_PPC64_SECTOFF_HI");
|
||||
case R_PPC64_SECTOFF_HA: UNHANDL("R_PPC64_SECTOFF_HA");
|
||||
case R_PPC64_ADDR30: UNHANDL("R_PPC64_ADDR30");
|
||||
case R_PPC64_ADDR64: UNHANDL("R_PPC64_ADDR64");
|
||||
case R_PPC64_ADDR64: ADD(64, 0, "R_PPC64_ADDR64", RZ_RELOC_BASE_SYMBOL);
|
||||
case R_PPC64_ADDR16_HIGHER: UNHANDL("R_PPC64_ADDR16_HIGHER");
|
||||
case R_PPC64_ADDR16_HIGHERA: UNHANDL("R_PPC64_ADDR16_HIGHERA");
|
||||
case R_PPC64_ADDR16_HIGHEST: UNHANDL("R_PPC64_ADDR16_HIGHEST");
|
||||
|
|
|
|||
|
|
@ -1604,6 +1604,7 @@ static void patch_reloc_arm64(RZ_INOUT RzBuffer *buf_patched, const ut64 patch_a
|
|||
* \brief Patches the opcode at a given address depending on the relocation type.
|
||||
*
|
||||
* NOTE: Some relocation symbols are not yet implemented
|
||||
* https://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi.html#RELOC-TYPE
|
||||
*
|
||||
* \param buf_patched Buffer from which the opcode is read and the patched opcode is written to.
|
||||
* \param patch_addr The address of the opcode being patched.
|
||||
|
|
@ -1639,6 +1640,16 @@ static void patch_reloc_ppc64(RZ_INOUT RzBuffer *buf_patched, const ut64 patch_a
|
|||
word = 2;
|
||||
val = (fs->S + fs->A) & 0xffff;
|
||||
break;
|
||||
case R_PPC64_RELATIVE:
|
||||
// R_PPC64_RELATIVE 22 doubleword64 B + A
|
||||
word = 8;
|
||||
val = (fs->B + fs->A);
|
||||
break;
|
||||
case R_PPC64_ADDR64:
|
||||
// R_PPC64_ADDR64 38 doubleword64 S + A
|
||||
word = 8;
|
||||
val = (fs->S + fs->A);
|
||||
break;
|
||||
case R_PPC64_REL16_LO:
|
||||
word = 2;
|
||||
val = (fs->S + fs->A - fs->P) & 0xffff;
|
||||
|
|
@ -1687,6 +1698,10 @@ static void patch_reloc_ppc64(RZ_INOUT RzBuffer *buf_patched, const ut64 patch_a
|
|||
rz_write_ble32(buf, val, big_endian);
|
||||
rz_buf_write_at(buf_patched, patch_addr, buf, 4);
|
||||
break;
|
||||
case 8:
|
||||
rz_write_ble64(buf, val, big_endian);
|
||||
rz_buf_write_at(buf_patched, patch_addr, buf, 8);
|
||||
break;
|
||||
default:
|
||||
RZ_LOG_WARN("PowerPC 64: Unhandled patching case for relocation %d with word size %u.\n", rel_type, word);
|
||||
return;
|
||||
|
|
|
|||
Loading…
Reference in a new issue