diff options
-rwxr-xr-x | scripts/relocate_sdk.py | 54 |
1 files changed, 35 insertions, 19 deletions
diff --git a/scripts/relocate_sdk.py b/scripts/relocate_sdk.py index 1d7bbb3849..fe6e4e0320 100755 --- a/scripts/relocate_sdk.py +++ b/scripts/relocate_sdk.py | |||
@@ -31,7 +31,7 @@ import os | |||
31 | import re | 31 | import re |
32 | import errno | 32 | import errno |
33 | 33 | ||
34 | old_prefix = re.compile("##DEFAULT_INSTALL_DIR##") | 34 | old_prefix = re.compile(b"##DEFAULT_INSTALL_DIR##") |
35 | 35 | ||
36 | def get_arch(): | 36 | def get_arch(): |
37 | f.seek(0) | 37 | f.seek(0) |
@@ -92,12 +92,15 @@ def change_interpreter(elf_file_name): | |||
92 | # External SDKs with mixed pre-compiled binaries should not get | 92 | # External SDKs with mixed pre-compiled binaries should not get |
93 | # relocated so look for some variant of /lib | 93 | # relocated so look for some variant of /lib |
94 | fname = f.read(11) | 94 | fname = f.read(11) |
95 | if fname.startswith("/lib/") or fname.startswith("/lib64/") or fname.startswith("/lib32/") or fname.startswith("/usr/lib32/") or fname.startswith("/usr/lib32/") or fname.startswith("/usr/lib64/"): | 95 | if fname.startswith(b"/lib/") or fname.startswith(b"/lib64/") or \ |
96 | fname.startswith(b"/lib32/") or fname.startswith(b"/usr/lib32/") or \ | ||
97 | fname.startswith(b"/usr/lib32/") or fname.startswith(b"/usr/lib64/"): | ||
96 | break | 98 | break |
97 | if (len(new_dl_path) >= p_filesz): | 99 | if (len(new_dl_path) >= p_filesz): |
98 | print "ERROR: could not relocate %s, interp size = %i and %i is needed." % (elf_file_name, p_memsz, len(new_dl_path) + 1) | 100 | print("ERROR: could not relocate %s, interp size = %i and %i is needed." \ |
101 | % (elf_file_name, p_memsz, len(new_dl_path) + 1)) | ||
99 | break | 102 | break |
100 | dl_path = new_dl_path + "\0" * (p_filesz - len(new_dl_path)) | 103 | dl_path = new_dl_path + b"\0" * (p_filesz - len(new_dl_path)) |
101 | f.seek(p_offset) | 104 | f.seek(p_offset) |
102 | f.write(dl_path) | 105 | f.write(dl_path) |
103 | break | 106 | break |
@@ -129,40 +132,40 @@ def change_dl_sysdirs(): | |||
129 | sh_name, sh_type, sh_flags, sh_addr, sh_offset, sh_size, sh_link,\ | 132 | sh_name, sh_type, sh_flags, sh_addr, sh_offset, sh_size, sh_link,\ |
130 | sh_info, sh_addralign, sh_entsize = struct.unpack(sh_fmt, sh_hdr) | 133 | sh_info, sh_addralign, sh_entsize = struct.unpack(sh_fmt, sh_hdr) |
131 | 134 | ||
132 | name = sh_strtab[sh_name:sh_strtab.find("\0", sh_name)] | 135 | name = sh_strtab[sh_name:sh_strtab.find(b"\0", sh_name)] |
133 | 136 | ||
134 | """ look only into SHT_PROGBITS sections """ | 137 | """ look only into SHT_PROGBITS sections """ |
135 | if sh_type == 1: | 138 | if sh_type == 1: |
136 | f.seek(sh_offset) | 139 | f.seek(sh_offset) |
137 | """ default library paths cannot be changed on the fly because """ | 140 | """ default library paths cannot be changed on the fly because """ |
138 | """ the string lengths have to be changed too. """ | 141 | """ the string lengths have to be changed too. """ |
139 | if name == ".sysdirs": | 142 | if name == b".sysdirs": |
140 | sysdirs = f.read(sh_size) | 143 | sysdirs = f.read(sh_size) |
141 | sysdirs_off = sh_offset | 144 | sysdirs_off = sh_offset |
142 | sysdirs_sect_size = sh_size | 145 | sysdirs_sect_size = sh_size |
143 | elif name == ".sysdirslen": | 146 | elif name == b".sysdirslen": |
144 | sysdirslen = f.read(sh_size) | 147 | sysdirslen = f.read(sh_size) |
145 | sysdirslen_off = sh_offset | 148 | sysdirslen_off = sh_offset |
146 | elif name == ".ldsocache": | 149 | elif name == b".ldsocache": |
147 | ldsocache_path = f.read(sh_size) | 150 | ldsocache_path = f.read(sh_size) |
148 | new_ldsocache_path = old_prefix.sub(new_prefix, ldsocache_path) | 151 | new_ldsocache_path = old_prefix.sub(new_prefix, ldsocache_path) |
149 | # pad with zeros | 152 | # pad with zeros |
150 | new_ldsocache_path += "\0" * (sh_size - len(new_ldsocache_path)) | 153 | new_ldsocache_path += b"\0" * (sh_size - len(new_ldsocache_path)) |
151 | # write it back | 154 | # write it back |
152 | f.seek(sh_offset) | 155 | f.seek(sh_offset) |
153 | f.write(new_ldsocache_path) | 156 | f.write(new_ldsocache_path) |
154 | 157 | ||
155 | if sysdirs != "" and sysdirslen != "": | 158 | if sysdirs != "" and sysdirslen != "": |
156 | paths = sysdirs.split("\0") | 159 | paths = sysdirs.split(b"\0") |
157 | sysdirs = "" | 160 | sysdirs = b"" |
158 | sysdirslen = "" | 161 | sysdirslen = b"" |
159 | for path in paths: | 162 | for path in paths: |
160 | """ exit the loop when we encounter first empty string """ | 163 | """ exit the loop when we encounter first empty string """ |
161 | if path == "": | 164 | if path == b"": |
162 | break | 165 | break |
163 | 166 | ||
164 | new_path = old_prefix.sub(new_prefix, path) | 167 | new_path = old_prefix.sub(new_prefix, path) |
165 | sysdirs += new_path + "\0" | 168 | sysdirs += new_path + b"\0" |
166 | 169 | ||
167 | if arch == 32: | 170 | if arch == 32: |
168 | sysdirslen += struct.pack("<L", len(new_path)) | 171 | sysdirslen += struct.pack("<L", len(new_path)) |
@@ -170,7 +173,7 @@ def change_dl_sysdirs(): | |||
170 | sysdirslen += struct.pack("<Q", len(new_path)) | 173 | sysdirslen += struct.pack("<Q", len(new_path)) |
171 | 174 | ||
172 | """ pad with zeros """ | 175 | """ pad with zeros """ |
173 | sysdirs += "\0" * (sysdirs_sect_size - len(sysdirs)) | 176 | sysdirs += b"\0" * (sysdirs_sect_size - len(sysdirs)) |
174 | 177 | ||
175 | """ write the sections back """ | 178 | """ write the sections back """ |
176 | f.seek(sysdirs_off) | 179 | f.seek(sysdirs_off) |
@@ -178,13 +181,19 @@ def change_dl_sysdirs(): | |||
178 | f.seek(sysdirslen_off) | 181 | f.seek(sysdirslen_off) |
179 | f.write(sysdirslen) | 182 | f.write(sysdirslen) |
180 | 183 | ||
181 | |||
182 | # MAIN | 184 | # MAIN |
183 | if len(sys.argv) < 4: | 185 | if len(sys.argv) < 4: |
184 | sys.exit(-1) | 186 | sys.exit(-1) |
185 | 187 | ||
186 | new_prefix = sys.argv[1] | 188 | # In python > 3, strings may also contain Unicode characters. So, convert |
187 | new_dl_path = sys.argv[2] | 189 | # them to bytes |
190 | if sys.version_info < (3,): | ||
191 | new_prefix = sys.argv[1] | ||
192 | new_dl_path = sys.argv[2] | ||
193 | else: | ||
194 | new_prefix = sys.argv[1].encode() | ||
195 | new_dl_path = sys.argv[2].encode() | ||
196 | |||
188 | executables_list = sys.argv[3:] | 197 | executables_list = sys.argv[3:] |
189 | 198 | ||
190 | for e in executables_list: | 199 | for e in executables_list: |
@@ -196,7 +205,7 @@ for e in executables_list: | |||
196 | 205 | ||
197 | try: | 206 | try: |
198 | f = open(e, "r+b") | 207 | f = open(e, "r+b") |
199 | except IOError, ioex: | 208 | except IOError as ioex: |
200 | if ioex.errno == errno.ETXTBSY: | 209 | if ioex.errno == errno.ETXTBSY: |
201 | print("Could not open %s. File used by another process.\nPlease "\ | 210 | print("Could not open %s. File used by another process.\nPlease "\ |
202 | "make sure you exit all processes that might use any SDK "\ | 211 | "make sure you exit all processes that might use any SDK "\ |
@@ -205,6 +214,9 @@ for e in executables_list: | |||
205 | print("Could not open %s: %s(%d)" % (e, ioex.strerror, ioex.errno)) | 214 | print("Could not open %s: %s(%d)" % (e, ioex.strerror, ioex.errno)) |
206 | sys.exit(-1) | 215 | sys.exit(-1) |
207 | 216 | ||
217 | # Save old size and do a size check at the end. Just a safety measure. | ||
218 | old_size = os.path.getsize(e) | ||
219 | |||
208 | arch = get_arch() | 220 | arch = get_arch() |
209 | if arch: | 221 | if arch: |
210 | parse_elf_header() | 222 | parse_elf_header() |
@@ -217,3 +229,7 @@ for e in executables_list: | |||
217 | 229 | ||
218 | f.close() | 230 | f.close() |
219 | 231 | ||
232 | if old_size != os.path.getsize(e): | ||
233 | print("New file size for %s is different. Looks like a relocation error!", e) | ||
234 | sys.exit(-1) | ||
235 | |||