diff options
author | Dan Albert <danalbert@google.com> | 2018-08-10 16:55:20 -0700 |
---|---|---|
committer | Dan Albert <danalbert@google.com> | 2018-08-10 16:55:20 -0700 |
commit | 9e67cc470301b5c66ea4401cba9b341f829a302a (patch) | |
tree | 382791319b20c088e65f6ebc937d3da0d15ce37d /parse_elfnote.py | |
parent | dd0f579a20d0eac7900bd8bdbe0d875d61dcbf3e (diff) | |
download | ndk-9e67cc470301b5c66ea4401cba9b341f829a302a.tar.gz |
Python 3 compatibility for parse_elfnote.py.
Test: Used with python 2.7 and python 3.6
Bug: None
Change-Id: I2d58a67467b69d55c9f46753e72ccd639d2347be
Diffstat (limited to 'parse_elfnote.py')
-rwxr-xr-x | parse_elfnote.py | 32 |
1 files changed, 18 insertions, 14 deletions
diff --git a/parse_elfnote.py b/parse_elfnote.py index f85fc8a35..74a61fbbf 100755 --- a/parse_elfnote.py +++ b/parse_elfnote.py @@ -32,10 +32,6 @@ import struct import subprocess import sys -try: - from StringIO import StringIO -except ImportError: - from io import StringIO SEC_NAME = '.note.android.ident' NDK_RESERVED_SIZE = 64 @@ -54,21 +50,27 @@ def round_up_to_nearest(val, step): class StructParser(object): def __init__(self, buf): - self._sio = StringIO(buf) + self.buf = buf + self.pos = 0 @property - def _remaining(self): - return self._sio.len - self._sio.pos + def remaining(self): + return len(self.buf) - self.pos @property def empty(self): - return self._remaining == 0 + return self.remaining == 0 + + def read(self, read_len): + buf = self.buf[self.pos:read_len + self.pos] + self.pos += read_len + return buf def read_struct(self, fmt, kind): fmt = struct.Struct(fmt) - if self._remaining < fmt.size: + if self.remaining < fmt.size: sys.exit('error: {} was truncated'.format(kind)) - return fmt.unpack(self._sio.read(fmt.size)) + return fmt.unpack(self.read(fmt.size)) def iterate_notes(sec_data): @@ -82,7 +84,7 @@ def iterate_notes(sec_data): 'note body') name = name[:namesz] if len(name) > 0: - if name[-1:] == '\0': + if name[-1:] == b'\0': name = name[:-1] else: logger().warning('note name %s isn\'t NUL-terminated', name) @@ -97,9 +99,11 @@ def dump_android_ident_note(note): return # Binaries generated by NDK r14 and later have these extra fields. Platform # binaries and binaries generated by older NDKs don't. - (ndk_version, ndk_build_number) = note.read_struct( + ndk_version, ndk_build_number = note.read_struct( '{}s{}s'.format(NDK_RESERVED_SIZE, NDK_RESERVED_SIZE), 'note descriptor') + ndk_version = ndk_version.decode('utf-8') + ndk_build_number = ndk_build_number.decode('utf-8') print('ABI_NDK_VERSION: {}'.format(ndk_version.rstrip('\0'))) print('ABI_NDK_BUILD_NUMBER: {}'.format(ndk_build_number.rstrip('\0'))) if not note.empty: @@ -110,7 +114,7 @@ def dump_android_ident_note(note): def get_section_pos(sec_name, file_path): cmd = ['readelf', '--sections', '-W', file_path] output = subprocess.check_output(cmd) - lines = output.splitlines() + lines = output.decode('utf-8').splitlines() for line in lines: logger().debug('Checking line for "%s": %s', sec_name, line) # Looking for a line like the following (all whitespace of unknown @@ -168,7 +172,7 @@ def main(): if len(sec_data) == 0: logger().warning('%s section is empty', SEC_NAME) for (name, kind, desc) in iterate_notes(sec_data): - if (name, kind) == ('Android', 1): + if (name, kind) == (b'Android', 1): dump_android_ident_note(desc) else: logger().warning('unrecognized note (name %s, type %d)', |