relocate_sdk.py: Allow script to work with Python 2.4 and 3.

Python 2.4 does not support the 'b' string literal or the
keyword 'as' in exception handling. Python 3 does not accept
the old method of exception handling and defaults to unicode.
The b() function converts strings to bytes on Python 3 and
using sys.exc_info() avoids the exception handling syntax.

(From OE-Core master rev: 1e2ec5f576f167673d7980737826987fefdc74a9)

(From OE-Core rev: 343127f2f81be337596d3eacbbc92278e82ce574)

Signed-off-by: Konrad Scherer <Konrad.Scherer@windriver.com>
Signed-off-by: Saul Wold <sgw@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Konrad Scherer 2013-10-17 10:17:20 -04:00 committed by Richard Purdie
parent fc9f1c8168
commit 76e0ce8229
1 changed files with 25 additions and 17 deletions

View File

@ -31,7 +31,14 @@ import os
import re import re
import errno import errno
old_prefix = re.compile(b"##DEFAULT_INSTALL_DIR##") if sys.version < '3':
def b(x):
return x
else:
def b(x):
return x.encode(sys.getfilesystemencoding())
old_prefix = re.compile(b("##DEFAULT_INSTALL_DIR##"))
def get_arch(): def get_arch():
f.seek(0) f.seek(0)
@ -92,15 +99,15 @@ def change_interpreter(elf_file_name):
# External SDKs with mixed pre-compiled binaries should not get # External SDKs with mixed pre-compiled binaries should not get
# relocated so look for some variant of /lib # relocated so look for some variant of /lib
fname = f.read(11) fname = f.read(11)
if fname.startswith(b"/lib/") or fname.startswith(b"/lib64/") or \ if fname.startswith(b("/lib/")) or fname.startswith(b("/lib64/")) or \
fname.startswith(b"/lib32/") or fname.startswith(b"/usr/lib32/") or \ fname.startswith(b("/lib32/")) or fname.startswith(b("/usr/lib32/")) or \
fname.startswith(b"/usr/lib32/") or fname.startswith(b"/usr/lib64/"): fname.startswith(b("/usr/lib32/")) or fname.startswith(b("/usr/lib64/")):
break break
if (len(new_dl_path) >= p_filesz): if (len(new_dl_path) >= p_filesz):
print("ERROR: could not relocate %s, interp size = %i and %i is needed." \ print("ERROR: could not relocate %s, interp size = %i and %i is needed." \
% (elf_file_name, p_memsz, len(new_dl_path) + 1)) % (elf_file_name, p_memsz, len(new_dl_path) + 1))
break break
dl_path = new_dl_path + b"\0" * (p_filesz - len(new_dl_path)) dl_path = new_dl_path + b("\0") * (p_filesz - len(new_dl_path))
f.seek(p_offset) f.seek(p_offset)
f.write(dl_path) f.write(dl_path)
break break
@ -132,40 +139,40 @@ def change_dl_sysdirs():
sh_name, sh_type, sh_flags, sh_addr, sh_offset, sh_size, sh_link,\ sh_name, sh_type, sh_flags, sh_addr, sh_offset, sh_size, sh_link,\
sh_info, sh_addralign, sh_entsize = struct.unpack(sh_fmt, sh_hdr) sh_info, sh_addralign, sh_entsize = struct.unpack(sh_fmt, sh_hdr)
name = sh_strtab[sh_name:sh_strtab.find(b"\0", sh_name)] name = sh_strtab[sh_name:sh_strtab.find(b("\0"), sh_name)]
""" look only into SHT_PROGBITS sections """ """ look only into SHT_PROGBITS sections """
if sh_type == 1: if sh_type == 1:
f.seek(sh_offset) f.seek(sh_offset)
""" default library paths cannot be changed on the fly because """ """ default library paths cannot be changed on the fly because """
""" the string lengths have to be changed too. """ """ the string lengths have to be changed too. """
if name == b".sysdirs": if name == b(".sysdirs"):
sysdirs = f.read(sh_size) sysdirs = f.read(sh_size)
sysdirs_off = sh_offset sysdirs_off = sh_offset
sysdirs_sect_size = sh_size sysdirs_sect_size = sh_size
elif name == b".sysdirslen": elif name == b(".sysdirslen"):
sysdirslen = f.read(sh_size) sysdirslen = f.read(sh_size)
sysdirslen_off = sh_offset sysdirslen_off = sh_offset
elif name == b".ldsocache": elif name == b(".ldsocache"):
ldsocache_path = f.read(sh_size) ldsocache_path = f.read(sh_size)
new_ldsocache_path = old_prefix.sub(new_prefix, ldsocache_path) new_ldsocache_path = old_prefix.sub(new_prefix, ldsocache_path)
# pad with zeros # pad with zeros
new_ldsocache_path += b"\0" * (sh_size - len(new_ldsocache_path)) new_ldsocache_path += b("\0") * (sh_size - len(new_ldsocache_path))
# write it back # write it back
f.seek(sh_offset) f.seek(sh_offset)
f.write(new_ldsocache_path) f.write(new_ldsocache_path)
if sysdirs != "" and sysdirslen != "": if sysdirs != "" and sysdirslen != "":
paths = sysdirs.split(b"\0") paths = sysdirs.split(b("\0"))
sysdirs = b"" sysdirs = b("")
sysdirslen = b"" sysdirslen = b("")
for path in paths: for path in paths:
""" exit the loop when we encounter first empty string """ """ exit the loop when we encounter first empty string """
if path == b"": if path == b(""):
break break
new_path = old_prefix.sub(new_prefix, path) new_path = old_prefix.sub(new_prefix, path)
sysdirs += new_path + b"\0" sysdirs += new_path + b("\0")
if arch == 32: if arch == 32:
sysdirslen += struct.pack("<L", len(new_path)) sysdirslen += struct.pack("<L", len(new_path))
@ -173,7 +180,7 @@ def change_dl_sysdirs():
sysdirslen += struct.pack("<Q", len(new_path)) sysdirslen += struct.pack("<Q", len(new_path))
""" pad with zeros """ """ pad with zeros """
sysdirs += b"\0" * (sysdirs_sect_size - len(sysdirs)) sysdirs += b("\0") * (sysdirs_sect_size - len(sysdirs))
""" write the sections back """ """ write the sections back """
f.seek(sysdirs_off) f.seek(sysdirs_off)
@ -205,7 +212,8 @@ for e in executables_list:
try: try:
f = open(e, "r+b") f = open(e, "r+b")
except IOError as ioex: except IOError:
exctype, ioex = sys.exc_info()[:2]
if ioex.errno == errno.ETXTBSY: if ioex.errno == errno.ETXTBSY:
print("Could not open %s. File used by another process.\nPlease "\ print("Could not open %s. File used by another process.\nPlease "\
"make sure you exit all processes that might use any SDK "\ "make sure you exit all processes that might use any SDK "\