aboutsummaryrefslogtreecommitdiff
path: root/parse_elfnote.py
diff options
context:
space:
mode:
authorDan Albert <danalbert@google.com>2018-08-10 16:55:20 -0700
committerDan Albert <danalbert@google.com>2018-08-10 16:55:20 -0700
commit9e67cc470301b5c66ea4401cba9b341f829a302a (patch)
tree382791319b20c088e65f6ebc937d3da0d15ce37d /parse_elfnote.py
parentdd0f579a20d0eac7900bd8bdbe0d875d61dcbf3e (diff)
downloadndk-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-xparse_elfnote.py32
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)',