From 747715ae24935dd8e1b24bab1bf55971c1ad0222 Mon Sep 17 00:00:00 2001 From: Logan Chien Date: Wed, 15 Mar 2017 14:53:59 +0800 Subject: [PATCH 1/2] vndk-def: Add symbol usages in dependency dumps. This commit dumps the symbol usages in the dependency. Test: Run ./vndk_definition_tool.py deps --symbol ... Change-Id: I474dd0c0184e6dabd06968f953137384e14862c2 --- .../definition-tool/vndk_definition_tool.py | 35 ++++++++++++++++--- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/vndk/tools/definition-tool/vndk_definition_tool.py b/vndk/tools/definition-tool/vndk_definition_tool.py index 0cd95835c..78169d9a6 100755 --- a/vndk/tools/definition-tool/vndk_definition_tool.py +++ b/vndk/tools/definition-tool/vndk_definition_tool.py @@ -1717,6 +1717,10 @@ class DepsCommand(ELFGraphCommand): '--leaf', action='store_true', help='print binaries without dependencies or usages') + parser.add_argument( + '--symbols', action='store_true', + help='print symbols') + def main(self, args): graph = ELFLinker.create(args.system, args.system_dir_as_vendor, args.vendor, args.vendor_dir_as_system, @@ -1725,8 +1729,27 @@ class DepsCommand(ELFGraphCommand): results = [] for partition in range(NUM_PARTITIONS): for name, lib in graph.lib_pt[partition].items(): - assoc_libs = lib.users if args.revert else lib.deps - results.append((name, sorted_lib_path_list(assoc_libs))) + if not args.symbols: + def collect_symbols(user, definer): + return () + else: + def collect_symbols(user, definer): + symbols = set() + for symbol, exp_lib in user.linked_symbols.items(): + if exp_lib == definer: + symbols.add(symbol) + return sorted(symbols) + + data = [] + if args.revert: + for assoc_lib in sorted(lib.users, key=lambda x: x.path): + data.append((assoc_lib.path, + collect_symbols(assoc_lib, lib))) + else: + for assoc_lib in sorted(lib.deps, key=lambda x: x.path): + data.append((assoc_lib.path, + collect_symbols(lib, assoc_lib))) + results.append((name, data)) results.sort() if args.leaf: @@ -1734,10 +1757,12 @@ class DepsCommand(ELFGraphCommand): if not deps: print(name) else: - for name, deps in results: + for name, assoc_libs in results: print(name) - for dep in deps: - print('\t' + dep) + for assoc_lib, symbols in assoc_libs: + print('\t' + assoc_lib) + for symbol in symbols: + print('\t\t' + symbol) return 0 From 3e641efbe6cbb49f3d8b2f44e4db13a3a420601b Mon Sep 17 00:00:00 2001 From: Logan Chien Date: Thu, 16 Mar 2017 08:43:32 +0800 Subject: [PATCH 2/2] vndk-def: Don't remove all deps in normalization. This commit no longer removes all dependencies (including system and vendor dependencies) when a generic reference library has a dependency to a library on the vendor partition. After this commit is merged, vndk_definition_tool.py will only remove the offending dependencies. Test: Run vndk_definition_tool.py against bullhead build with tweaked dependencies. Change-Id: Id6d23112128d9bbfec9e1e4430677a07f20fd193 --- vndk/tools/definition-tool/vndk_definition_tool.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vndk/tools/definition-tool/vndk_definition_tool.py b/vndk/tools/definition-tool/vndk_definition_tool.py index 78169d9a6..7c1653848 100755 --- a/vndk/tools/definition-tool/vndk_definition_tool.py +++ b/vndk/tools/definition-tool/vndk_definition_tool.py @@ -996,14 +996,14 @@ class ELFLinker(object): 'vendor lib {}. Assume such dependency does ' 'not exist.'.format(lib.path, dep.path), file=sys.stderr) - lib.remove_dep(dep, ELFLinkData.NEEDED) + lib.remove_dep(dep, ELFLinkData.NEEDED) for dep in list(lib.dl_deps): if not is_system_lib_or_sp_hal(dep): print('error: {}: system exe/lib must not dlopen() ' 'vendor lib {}. Assume such dependency does ' 'not exist.'.format(lib.path, dep.path), file=sys.stderr) - lib.remove_dep(dep, ELFLinkData.DLOPEN) + lib.remove_dep(dep, ELFLinkData.DLOPEN) else: # If lib is not in AOSP generic reference, then we assume that # lib must be moved to vendor partition.