More changes to port to Python 3
All tox tests pass now!!
diff --git a/scripts/readelf.py b/scripts/readelf.py
index 6ecac7b..04c75ba 100755
--- a/scripts/readelf.py
+++ b/scripts/readelf.py
@@ -9,7 +9,6 @@
#-------------------------------------------------------------------------------
import os, sys
from optparse import OptionParser
-from itertools import ifilter
import string
# If elftools is not installed, maybe we're running from the root or scripts
@@ -21,6 +20,8 @@
from elftools import __version__
from elftools.common.exceptions import ELFError
+from elftools.common.py3compat import (
+ ifilter, byte2int, bytes2str, itervalues, str2bytes)
from elftools.elf.elffile import ELFFile
from elftools.elf.segments import InterpSegment
from elftools.elf.sections import SymbolTableSection
@@ -65,7 +66,7 @@
"""
self._emitline('ELF Header:')
self._emit(' Magic: ')
- self._emitline(' '.join('%2.2x' % ord(b)
+ self._emitline(' '.join('%2.2x' % byte2int(b)
for b in self.elffile.e_ident_raw))
header = self.elffile.header
e_ident = header['e_ident']
@@ -173,7 +174,7 @@
if isinstance(segment, InterpSegment):
self._emitline(' [Requesting program interpreter: %s]' %
- segment.get_interp_name())
+ bytes2str(segment.get_interp_name()))
# Sections to segments mapping
#
@@ -190,7 +191,7 @@
for section in self.elffile.iter_sections():
if ( not section.is_null() and
segment.section_in_segment(section)):
- self._emit('%s ' % section.name)
+ self._emit('%s ' % bytes2str(section.name))
self._emitline('')
@@ -217,7 +218,7 @@
#
for nsec, section in enumerate(self.elffile.iter_sections()):
self._emit(' [%2u] %-17.17s %-15.15s ' % (
- nsec, section.name, describe_sh_type(section['sh_type'])))
+ nsec, bytes2str(section.name), describe_sh_type(section['sh_type'])))
if self.elffile.elfclass == 32:
self._emitline('%s %s %s %s %3s %2s %3s %2s' % (
@@ -259,11 +260,11 @@
if section['sh_entsize'] == 0:
self._emitline("\nSymbol table '%s' has a sh_entsize of zero!" % (
- section.name))
+ bytes2str(section.name)))
continue
self._emitline("\nSymbol table '%s' contains %s entries:" % (
- section.name, section.num_symbols()))
+ bytes2str(section.name), section.num_symbols()))
if self.elffile.elfclass == 32:
self._emitline(' Num: Value Size Type Bind Vis Ndx Name')
@@ -280,7 +281,7 @@
describe_symbol_bind(symbol['st_info']['bind']),
describe_symbol_visibility(symbol['st_other']['visibility']),
describe_symbol_shndx(symbol['st_shndx']),
- symbol.name))
+ bytes2str(symbol.name)))
def display_relocations(self):
""" Display the relocations contained in the file
@@ -292,7 +293,7 @@
has_relocation_sections = True
self._emitline("\nRelocation section '%s' at offset %s contains %s entries:" % (
- section.name,
+ bytes2str(section.name),
self._format_hex(section['sh_offset']),
section.num_relocations()))
if section.is_RELA():
@@ -330,7 +331,7 @@
symbol['st_value'],
fullhex=True, lead0x=False),
' ' if self.elffile.elfclass == 32 else '',
- symbol_name))
+ bytes2str(symbol_name)))
if section.is_RELA():
self._emit(' %s %x' % (
'+' if rel['r_addend'] >= 0 else '-',
@@ -350,7 +351,7 @@
section_spec))
return
- self._emitline("\nHex dump of section '%s':" % section.name)
+ self._emitline("\nHex dump of section '%s':" % bytes2str(section.name))
self._note_relocs_for_section(section)
addr = section['sh_addr']
data = section.data()
@@ -364,18 +365,18 @@
self._emit(' %s ' % self._format_hex(addr, fieldsize=8))
for i in range(16):
if i < linebytes:
- self._emit('%2.2x' % ord(data[dataptr + i]))
+ self._emit('%2.2x' % byte2int(data[dataptr + i]))
else:
self._emit(' ')
if i % 4 == 3:
self._emit(' ')
for i in range(linebytes):
- c = data[dataptr + i]
- if c >= ' ' and ord(c) < 0x7f:
- self._emit(c)
+ c = data[dataptr + i : dataptr + i + 1]
+ if byte2int(c[0]) >= 32 and byte2int(c[0]) < 0x7f:
+ self._emit(bytes2str(c))
else:
- self._emit('.')
+ self._emit(bytes2str(b'.'))
self._emitline()
addr += linebytes
@@ -393,27 +394,27 @@
section_spec))
return
- printables = set(string.printable)
- self._emitline("\nString dump of section '%s':" % section.name)
+ self._emitline("\nString dump of section '%s':" % bytes2str(section.name))
found = False
data = section.data()
dataptr = 0
while dataptr < len(data):
- while dataptr < len(data) and data[dataptr] not in printables:
+ while ( dataptr < len(data) and
+ not (32 <= byte2int(data[dataptr]) <= 127)):
dataptr += 1
if dataptr >= len(data):
break
endptr = dataptr
- while endptr < len(data) and data[endptr] != '\x00':
+ while endptr < len(data) and byte2int(data[endptr]) != 0:
endptr += 1
found = True
self._emitline(' [%6x] %s' % (
- dataptr, data[dataptr:endptr]))
+ dataptr, bytes2str(data[dataptr:endptr])))
dataptr = endptr
@@ -479,7 +480,7 @@
return None
except ValueError:
# Not a number. Must be a name then
- return self.elffile.get_section_by_name(spec)
+ return self.elffile.get_section_by_name(str2bytes(spec))
def _note_relocs_for_section(self, section):
""" If there are relocation sections pointing to the givne section,
@@ -540,7 +541,7 @@
die.abbrev_code,
die.tag))
- for attr in die.attributes.itervalues():
+ for attr in itervalues(die.attributes):
name = attr.name
# Unknown attribute values are passed-through as integers
if isinstance(name, int):
@@ -568,10 +569,10 @@
cu_filename = ''
if len(lineprogram['include_directory']) > 0:
cu_filename = '%s/%s' % (
- lineprogram['include_directory'][0],
- lineprogram['file_entry'][0].name)
+ bytes2str(lineprogram['include_directory'][0]),
+ bytes2str(lineprogram['file_entry'][0].name))
else:
- cu_filename = lineprogram['file_entry'][0].name
+ cu_filename = bytes2str(lineprogram['file_entry'][0].name)
self._emitline('CU: %s:' % cu_filename)
self._emitline('File name Line number Starting address')
@@ -588,20 +589,20 @@
if file_entry.dir_index == 0:
# current directory
self._emitline('\n./%s:[++]' % (
- file_entry.name))
+ bytes2str(file_entry.name)))
else:
self._emitline('\n%s/%s:' % (
- lineprogram['include_directory'][file_entry.dir_index - 1],
- file_entry.name))
+ bytes2str(lineprogram['include_directory'][file_entry.dir_index - 1]),
+ bytes2str(file_entry.name)))
elif entry.command == DW_LNE_define_file:
self._emitline('%s:' % (
- lineprogram['include_directory'][entry.args[0].dir_index]))
+ bytes2str(lineprogram['include_directory'][entry.args[0].dir_index])))
elif not state.end_sequence:
# readelf doesn't print the state after end_sequence
# instructions. I think it's a bug but to be compatible
# I don't print them too.
self._emitline('%-35s %11d %18s' % (
- lineprogram['file_entry'][state.file - 1].name,
+ bytes2str(lineprogram['file_entry'][state.file - 1].name),
state.line,
'0' if state.address == 0 else
self._format_hex(state.address)))
@@ -621,7 +622,7 @@
self._emitline('\n%08x %08x %08x CIE' % (
entry.offset, entry['length'], entry['CIE_id']))
self._emitline(' Version: %d' % entry['version'])
- self._emitline(' Augmentation: "%s"' % entry['augmentation'])
+ self._emitline(' Augmentation: "%s"' % bytes2str(entry['augmentation']))
self._emitline(' Code alignment factor: %u' % entry['code_alignment_factor'])
self._emitline(' Data alignment factor: %d' % entry['data_alignment_factor'])
self._emitline(' Return address column: %d' % entry['return_address_register'])
@@ -652,7 +653,7 @@
entry.offset,
entry['length'],
entry['CIE_id'],
- entry['augmentation'],
+ bytes2str(entry['augmentation']),
entry['code_alignment_factor'],
entry['data_alignment_factor'],
entry['return_address_register']))