59 lines
1.7 KiB
Python
59 lines
1.7 KiB
Python
|
from .. import *
|
||
|
from ...types import *
|
||
|
from ...iterators import *
|
||
|
|
||
|
def defined(s): return s.st_shndx != SHN_UNDEF
|
||
|
|
||
|
def defines(elf, symN):
|
||
|
s = findSymbol(elf, symN)
|
||
|
print elf, symN, s
|
||
|
if s != None:
|
||
|
print s.st_shndx, s.st_name
|
||
|
return s != None and defined(s[1])
|
||
|
|
||
|
def derefSymbol(elf, s):
|
||
|
assert defined(s)
|
||
|
if s.st_shndx == SHN_ABS:
|
||
|
raise Exception("NYI")
|
||
|
else:
|
||
|
scn = elf_getscn(elf, s.st_shndx)
|
||
|
shdr = section_hdr(elf, scn);
|
||
|
off = 0
|
||
|
base = shdr.sh_addr if shdr.sh_addr != 0 else 0
|
||
|
start = s.st_value
|
||
|
end = s.st_value + s.st_size
|
||
|
r = ''
|
||
|
for d in data(scn):
|
||
|
if start >= end: break;
|
||
|
off = base + d.d_off
|
||
|
if start >= off and start < off + d.d_size:
|
||
|
c = cast(d.d_buf, POINTER(c_char))
|
||
|
l = min(off + d.d_size, end) - start
|
||
|
r += c[start- off : start - off + l]
|
||
|
start += l
|
||
|
|
||
|
return r
|
||
|
|
||
|
def derefSymbolFull(elf, s):
|
||
|
""" Given an elf file and a Elf{32/64}_Sym defined in the elf file,
|
||
|
return a tuple with the contents of memory refered to by the symbol,
|
||
|
and any Rel's and Rela's inside that memory.
|
||
|
"""
|
||
|
assert (defined(s))
|
||
|
contents = derefSymbol(elf, s)
|
||
|
relL = list(rels(elf, section=s.st_shndx, \
|
||
|
range=(s.st_value, s.st_size + s.st_value)))
|
||
|
relaL = list(relas(elf, section=s.st_shndx, \
|
||
|
range=(s.st_value, s.st_size + s.st_value)))
|
||
|
return (contents, relL, relaL)
|
||
|
|
||
|
# Given a symbol name return the symbol and section in which it occurs
|
||
|
def findSymbol(elf, s):
|
||
|
for scn in sections(elf, type=SHT_SYMTAB):
|
||
|
strndx = section_link(elf, scn)
|
||
|
for d in data(scn):
|
||
|
for (ind, sym) in syms(elf, d):
|
||
|
if s == elf_strptr(elf, strndx, sym.st_name):
|
||
|
return (scn, sym)
|
||
|
return None
|