diff options
Diffstat (limited to 'scripts/relocate_sdk.py')
| -rwxr-xr-x | scripts/relocate_sdk.py | 42 |
1 files changed, 25 insertions, 17 deletions
diff --git a/scripts/relocate_sdk.py b/scripts/relocate_sdk.py index fe6e4e0320..05d9fd65ed 100755 --- a/scripts/relocate_sdk.py +++ b/scripts/relocate_sdk.py | |||
| @@ -31,7 +31,14 @@ import os | |||
| 31 | import re | 31 | import re |
| 32 | import errno | 32 | import errno |
| 33 | 33 | ||
| 34 | old_prefix = re.compile(b"##DEFAULT_INSTALL_DIR##") | 34 | if sys.version < '3': |
| 35 | def b(x): | ||
| 36 | return x | ||
| 37 | else: | ||
| 38 | def b(x): | ||
| 39 | return x.encode(sys.getfilesystemencoding()) | ||
| 40 | |||
| 41 | old_prefix = re.compile(b("##DEFAULT_INSTALL_DIR##")) | ||
| 35 | 42 | ||
| 36 | def get_arch(): | 43 | def get_arch(): |
| 37 | f.seek(0) | 44 | f.seek(0) |
| @@ -92,15 +99,15 @@ def change_interpreter(elf_file_name): | |||
| 92 | # External SDKs with mixed pre-compiled binaries should not get | 99 | # External SDKs with mixed pre-compiled binaries should not get |
| 93 | # relocated so look for some variant of /lib | 100 | # relocated so look for some variant of /lib |
| 94 | fname = f.read(11) | 101 | fname = f.read(11) |
| 95 | if fname.startswith(b"/lib/") or fname.startswith(b"/lib64/") or \ | 102 | if fname.startswith(b("/lib/")) or fname.startswith(b("/lib64/")) or \ |
| 96 | fname.startswith(b"/lib32/") or fname.startswith(b"/usr/lib32/") or \ | 103 | fname.startswith(b("/lib32/")) or fname.startswith(b("/usr/lib32/")) or \ |
| 97 | fname.startswith(b"/usr/lib32/") or fname.startswith(b"/usr/lib64/"): | 104 | fname.startswith(b("/usr/lib32/")) or fname.startswith(b("/usr/lib64/")): |
| 98 | break | 105 | break |
| 99 | if (len(new_dl_path) >= p_filesz): | 106 | if (len(new_dl_path) >= p_filesz): |
| 100 | print("ERROR: could not relocate %s, interp size = %i and %i is needed." \ | 107 | print("ERROR: could not relocate %s, interp size = %i and %i is needed." \ |
| 101 | % (elf_file_name, p_memsz, len(new_dl_path) + 1)) | 108 | % (elf_file_name, p_memsz, len(new_dl_path) + 1)) |
| 102 | break | 109 | break |
| 103 | dl_path = new_dl_path + b"\0" * (p_filesz - len(new_dl_path)) | 110 | dl_path = new_dl_path + b("\0") * (p_filesz - len(new_dl_path)) |
| 104 | f.seek(p_offset) | 111 | f.seek(p_offset) |
| 105 | f.write(dl_path) | 112 | f.write(dl_path) |
| 106 | break | 113 | break |
| @@ -132,40 +139,40 @@ def change_dl_sysdirs(): | |||
| 132 | sh_name, sh_type, sh_flags, sh_addr, sh_offset, sh_size, sh_link,\ | 139 | sh_name, sh_type, sh_flags, sh_addr, sh_offset, sh_size, sh_link,\ |
| 133 | sh_info, sh_addralign, sh_entsize = struct.unpack(sh_fmt, sh_hdr) | 140 | sh_info, sh_addralign, sh_entsize = struct.unpack(sh_fmt, sh_hdr) |
| 134 | 141 | ||
| 135 | name = sh_strtab[sh_name:sh_strtab.find(b"\0", sh_name)] | 142 | name = sh_strtab[sh_name:sh_strtab.find(b("\0"), sh_name)] |
| 136 | 143 | ||
| 137 | """ look only into SHT_PROGBITS sections """ | 144 | """ look only into SHT_PROGBITS sections """ |
| 138 | if sh_type == 1: | 145 | if sh_type == 1: |
| 139 | f.seek(sh_offset) | 146 | f.seek(sh_offset) |
| 140 | """ default library paths cannot be changed on the fly because """ | 147 | """ default library paths cannot be changed on the fly because """ |
| 141 | """ the string lengths have to be changed too. """ | 148 | """ the string lengths have to be changed too. """ |
| 142 | if name == b".sysdirs": | 149 | if name == b(".sysdirs"): |
| 143 | sysdirs = f.read(sh_size) | 150 | sysdirs = f.read(sh_size) |
| 144 | sysdirs_off = sh_offset | 151 | sysdirs_off = sh_offset |
| 145 | sysdirs_sect_size = sh_size | 152 | sysdirs_sect_size = sh_size |
| 146 | elif name == b".sysdirslen": | 153 | elif name == b(".sysdirslen"): |
| 147 | sysdirslen = f.read(sh_size) | 154 | sysdirslen = f.read(sh_size) |
| 148 | sysdirslen_off = sh_offset | 155 | sysdirslen_off = sh_offset |
| 149 | elif name == b".ldsocache": | 156 | elif name == b(".ldsocache"): |
| 150 | ldsocache_path = f.read(sh_size) | 157 | ldsocache_path = f.read(sh_size) |
| 151 | new_ldsocache_path = old_prefix.sub(new_prefix, ldsocache_path) | 158 | new_ldsocache_path = old_prefix.sub(new_prefix, ldsocache_path) |
| 152 | # pad with zeros | 159 | # pad with zeros |
| 153 | new_ldsocache_path += b"\0" * (sh_size - len(new_ldsocache_path)) | 160 | new_ldsocache_path += b("\0") * (sh_size - len(new_ldsocache_path)) |
| 154 | # write it back | 161 | # write it back |
| 155 | f.seek(sh_offset) | 162 | f.seek(sh_offset) |
| 156 | f.write(new_ldsocache_path) | 163 | f.write(new_ldsocache_path) |
| 157 | 164 | ||
| 158 | if sysdirs != "" and sysdirslen != "": | 165 | if sysdirs != "" and sysdirslen != "": |
| 159 | paths = sysdirs.split(b"\0") | 166 | paths = sysdirs.split(b("\0")) |
| 160 | sysdirs = b"" | 167 | sysdirs = b("") |
| 161 | sysdirslen = b"" | 168 | sysdirslen = b("") |
| 162 | for path in paths: | 169 | for path in paths: |
| 163 | """ exit the loop when we encounter first empty string """ | 170 | """ exit the loop when we encounter first empty string """ |
| 164 | if path == b"": | 171 | if path == b(""): |
| 165 | break | 172 | break |
| 166 | 173 | ||
| 167 | new_path = old_prefix.sub(new_prefix, path) | 174 | new_path = old_prefix.sub(new_prefix, path) |
| 168 | sysdirs += new_path + b"\0" | 175 | sysdirs += new_path + b("\0") |
| 169 | 176 | ||
| 170 | if arch == 32: | 177 | if arch == 32: |
| 171 | sysdirslen += struct.pack("<L", len(new_path)) | 178 | sysdirslen += struct.pack("<L", len(new_path)) |
| @@ -173,7 +180,7 @@ def change_dl_sysdirs(): | |||
| 173 | sysdirslen += struct.pack("<Q", len(new_path)) | 180 | sysdirslen += struct.pack("<Q", len(new_path)) |
| 174 | 181 | ||
| 175 | """ pad with zeros """ | 182 | """ pad with zeros """ |
| 176 | sysdirs += b"\0" * (sysdirs_sect_size - len(sysdirs)) | 183 | sysdirs += b("\0") * (sysdirs_sect_size - len(sysdirs)) |
| 177 | 184 | ||
| 178 | """ write the sections back """ | 185 | """ write the sections back """ |
| 179 | f.seek(sysdirs_off) | 186 | f.seek(sysdirs_off) |
| @@ -205,7 +212,8 @@ for e in executables_list: | |||
| 205 | 212 | ||
| 206 | try: | 213 | try: |
| 207 | f = open(e, "r+b") | 214 | f = open(e, "r+b") |
| 208 | except IOError as ioex: | 215 | except IOError: |
| 216 | exctype, ioex = sys.exc_info()[:2] | ||
| 209 | if ioex.errno == errno.ETXTBSY: | 217 | if ioex.errno == errno.ETXTBSY: |
| 210 | print("Could not open %s. File used by another process.\nPlease "\ | 218 | print("Could not open %s. File used by another process.\nPlease "\ |
| 211 | "make sure you exit all processes that might use any SDK "\ | 219 | "make sure you exit all processes that might use any SDK "\ |
