Toggle Light / Dark / Auto color theme
Toggle table of contents sidebar
Source code for cle.backends.elf.relocation.pcc64
import logging
from .elfreloc import ELFReloc
from .generic import (
GenericAbsoluteAddendReloc ,
GenericIRelativeReloc ,
GenericJumpslotReloc ,
GenericRelativeReloc ,
GenericTLSDoffsetReloc ,
GenericTLSModIdReloc ,
GenericTLSOffsetReloc ,
)
log = logging . getLogger ( name = __name__ )
# http://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi-1.9.pdf
arch = "PPC64"
[docs]
class R_PPC64_JMP_SLOT ( ELFReloc ):
[docs]
def relocate ( self ):
if self . owner . is_ppc64_abiv1 :
# R_PPC64_JMP_SLOT
# http://osxr.org/glibc/source/sysdeps/powerpc/powerpc64/dl-machine.h?v=glibc-2.15#0405
# copy an entire function descriptor struct
addr = self . resolvedby . owner . memory . unpack_word ( self . resolvedby . relative_addr )
toc = self . resolvedby . owner . memory . unpack_word ( self . resolvedby . relative_addr + 8 )
aux = self . resolvedby . owner . memory . unpack_word ( self . resolvedby . relative_addr + 16 )
self . owner . memory . pack_word ( self . relative_addr , addr )
self . owner . memory . pack_word ( self . relative_addr + 8 , toc )
self . owner . memory . pack_word ( self . relative_addr + 16 , aux )
else :
self . owner . memory . pack_word ( self . relative_addr , self . resolvedby . rebased_addr )
return True
[docs]
class R_PPC64_RELATIVE ( GenericRelativeReloc ):
pass
[docs]
class R_PPC64_IRELATIVE ( GenericIRelativeReloc ):
pass
[docs]
class R_PPC64_ADDR64 ( GenericAbsoluteAddendReloc ):
pass
[docs]
class R_PPC64_GLOB_DAT ( GenericJumpslotReloc ):
pass
[docs]
class R_PPC64_DTPMOD64 ( GenericTLSModIdReloc ):
pass
[docs]
class R_PPC64_DTPREL64 ( GenericTLSDoffsetReloc ):
pass
[docs]
class R_PPC64_TPREL64 ( GenericTLSOffsetReloc ):
pass
[docs]
class R_PPC64_REL24 ( ELFReloc ):
"""
Relocation Type: 10
Calculation: (S + A - P) >> 2
Field: low24*
"""
@property
def value ( self ):
A = self . addend
S = self . resolvedby . rebased_addr
P = self . rebased_addr
return ( S + A - P ) >> 2
[docs]
def relocate ( self ):
if not self . resolved :
return False
instr = self . owner . memory . unpack_word ( self . relative_addr , size = 4 ) & 0b11111100000000000000000000000011
imm = self . value & 0xFFFFFF
self . owner . memory . pack_word ( self . relative_addr , instr | ( imm << 2 ), size = 4 )
return True
[docs]
class R_PPC64_TOC16_LO ( ELFReloc ):
"""
Relocation Type: 48
Calculation: #lo(S + A - .TOC.)
Field: half16
"""
@property
def value ( self ):
A = self . addend
S = self . resolvedby . rebased_addr
if self . owner . ppc64_initial_rtoc is None :
log . warning ( ".TOC. value not found" )
return ( S + A ) & 0xFFFF
TOC = self . owner . ppc64_initial_rtoc
return ( S + A - TOC ) & 0xFFFF
[docs]
def relocate ( self ):
if not self . resolved :
return False
self . owner . memory . pack_word ( self . relative_addr , self . value , size = 2 )
return True
[docs]
class R_PPC64_TOC16_HI ( ELFReloc ):
"""
Relocation Type: 49
Calculation: #hi(S + A - .TOC.)
Field: half16
"""
@property
def value ( self ):
A = self . addend
S = self . resolvedby . rebased_addr
if self . owner . ppc64_initial_rtoc is None :
log . warning ( ".TOC. value not found" )
return (( S + A ) >> 16 ) & 0xFFFF
TOC = self . owner . ppc64_initial_rtoc
return (( S + A - TOC ) >> 16 ) & 0xFFFF
[docs]
def relocate ( self ):
if not self . resolved :
return False
self . owner . memory . pack_word ( self . relative_addr , self . value , size = 2 )
return True
[docs]
class R_PPC64_TOC16_HA ( ELFReloc ):
"""
Relocation Type: 50
Calculation: #ha(S + A - .TOC.)
Field: half16
"""
@property
def value ( self ):
A = self . addend
S = self . resolvedby . rebased_addr
if self . owner . ppc64_initial_rtoc is None :
log . warning ( ".TOC. value not found" )
return ((( S + A ) >> 16 ) + ( 1 if (( S + A ) & 0x8000 ) else 0 )) & 0xFFFF
TOC = self . owner . ppc64_initial_rtoc
return ((( S + A - TOC ) >> 16 ) + ( 1 if (( S + A - TOC ) & 0x8000 ) else 0 )) & 0xFFFF
[docs]
def relocate ( self ):
if not self . resolved :
return False
self . owner . memory . pack_word ( self . relative_addr , self . value , size = 2 )
return True
[docs]
class R_PPC64_TOC ( ELFReloc ):
"""
Relocation Type: 51
Calculation: .TOC.
Field: doubleword64
"""
@property
def value ( self ):
if self . owner . ppc64_initial_rtoc is None :
log . warning ( ".TOC. value not found" )
return 0
return self . owner . ppc64_initial_rtoc