| OLD | NEW |
| 1 # Copyright 2014 The Chromium Authors. All rights reserved. | 1 # Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 """Helper script to close over all transitive dependencies of a given .nexe | 5 """Helper script to close over all transitive dependencies of a given .nexe |
| 6 executable. | 6 executable. |
| 7 | 7 |
| 8 e.g. Given | 8 e.g. Given |
| 9 A -> B | 9 A -> B |
| 10 B -> C | 10 B -> C |
| 11 B -> D | 11 B -> D |
| 12 C -> E | 12 C -> E |
| 13 | 13 |
| 14 where "A -> B" means A depends on B, then GetNeeded(A) will return A, B, C, D | 14 where "A -> B" means A depends on B, then GetNeeded(A) will return A, B, C, D |
| 15 and E. | 15 and E. |
| 16 """ | 16 """ |
| 17 | 17 |
| 18 import os | 18 import os |
| 19 import re | 19 import re |
| 20 import subprocess | 20 import subprocess |
| 21 | 21 |
| 22 import elf | 22 import elf |
| 23 | 23 |
| 24 SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) | 24 SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) |
| 25 SDK_DIR = os.path.dirname(os.path.dirname(SCRIPT_DIR)) | 25 SDK_DIR = os.path.dirname(os.path.dirname(SCRIPT_DIR)) |
| 26 | 26 |
| 27 NeededMatcher = re.compile('^ *NEEDED *([^ ]+)\n$') | 27 NeededMatcher = re.compile('^ *NEEDED *([^ ]+)\n$') |
| 28 FormatMatcher = re.compile('^(.+):\\s*file format (.+)\n$') | 28 FormatMatcher = re.compile('^(.+):\\s*file format (.+)\n$') |
| 29 | 29 |
| 30 RUNNABLE_LD = 'runnable-ld.so' # Name of the dynamic loader | 30 LOADER_X86 = 'runnable-ld.so' # Name of the dynamic loader |
| 31 LOADER_ARM = 'elf_loader_arm.nexe' # Name of the ARM dynamic loader |
| 31 | 32 |
| 32 OBJDUMP_ARCH_MAP = { | 33 OBJDUMP_ARCH_MAP = { |
| 33 # Names returned by Linux's objdump: | 34 # Names returned by Linux's objdump: |
| 34 'elf64-x86-64': 'x86-64', | 35 'elf64-x86-64': 'x86-64', |
| 35 'elf32-i386': 'x86-32', | 36 'elf32-i386': 'x86-32', |
| 36 'elf32-little': 'arm', | 37 'elf32-little': 'arm', |
| 37 'elf32-littlearm': 'arm', | 38 'elf32-littlearm': 'arm', |
| 38 # Names returned by old x86_64-nacl-objdump: | 39 # Names returned by old x86_64-nacl-objdump: |
| 39 'elf64-nacl': 'x86-64', | 40 'elf64-nacl': 'x86-64', |
| 40 'elf32-nacl': 'x86-32', | 41 'elf32-nacl': 'x86-32', |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 82 if dynamic: | 83 if dynamic: |
| 83 return _GetNeededDynamic(main_files, objdump, lib_path) | 84 return _GetNeededDynamic(main_files, objdump, lib_path) |
| 84 else: | 85 else: |
| 85 return _GetNeededStatic(main_files) | 86 return _GetNeededStatic(main_files) |
| 86 | 87 |
| 87 | 88 |
| 88 def _GetNeededDynamic(main_files, objdump, lib_path): | 89 def _GetNeededDynamic(main_files, objdump, lib_path): |
| 89 examined = set() | 90 examined = set() |
| 90 all_files, unexamined = GleanFromObjdump(main_files, None, objdump, lib_path) | 91 all_files, unexamined = GleanFromObjdump(main_files, None, objdump, lib_path) |
| 91 for arch in all_files.itervalues(): | 92 for arch in all_files.itervalues(): |
| 92 if unexamined and arch != 'arm': | 93 if unexamined: |
| 93 unexamined.add((RUNNABLE_LD, arch)) | 94 if arch == 'arm': |
| 95 unexamined.add((LOADER_ARM, arch)) |
| 96 else: |
| 97 unexamined.add((LOADER_X86, arch)) |
| 94 | 98 |
| 95 while unexamined: | 99 while unexamined: |
| 96 files_to_examine = {} | 100 files_to_examine = {} |
| 97 | 101 |
| 98 # Take all the currently unexamined files and group them | 102 # Take all the currently unexamined files and group them |
| 99 # by architecture. | 103 # by architecture. |
| 100 for name, arch in unexamined: | 104 for name, arch in unexamined: |
| 101 files_to_examine.setdefault(arch, []).append(name) | 105 files_to_examine.setdefault(arch, []).append(name) |
| 102 | 106 |
| 103 # Call GleanFromObjdump() for each architecture. | 107 # Call GleanFromObjdump() for each architecture. |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 224 raise Error('cannot find library %s' % name) | 228 raise Error('cannot find library %s' % name) |
| 225 return files | 229 return files |
| 226 | 230 |
| 227 | 231 |
| 228 def _GetNeededStatic(main_files): | 232 def _GetNeededStatic(main_files): |
| 229 needed = {} | 233 needed = {} |
| 230 for filename in main_files: | 234 for filename in main_files: |
| 231 arch = elf.ParseElfHeader(filename)[0] | 235 arch = elf.ParseElfHeader(filename)[0] |
| 232 needed[filename] = arch | 236 needed[filename] = arch |
| 233 return needed | 237 return needed |
| OLD | NEW |