OVMS3-idf/tools/esp_app_trace/pylibelf/util/syms/__init__.py
Alexey Gerenkov 55f1a63faf esp32: Adds functionality for application tracing over JTAG
- Implements application tracing module which allows to send arbitrary
   data to host over JTAG. This feature is useful for analyzing
   program modules behavior, dumping run-time application data etc.
 - Implements printf-like logging functions on top of apptrace module.
   This feature is a kind of semihosted printf functionality with lower
   overhead and impact on system behaviour as compared to standard printf.
2017-04-17 23:26:29 +03:00

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