Merge changes I0527ef62,I0d66a93f,I528ef380,Ia9140851,If1874867, ...
am: f9bd812ef0
Change-Id: I1a315eef3e253547a652c222dbaa7607e2b3ae6a
This commit is contained in:
@@ -43,7 +43,7 @@ class GraphBuilder(object):
|
|||||||
exported_symbols=exported_symbols,
|
exported_symbols=exported_symbols,
|
||||||
imported_symbols=imported_symbols)
|
imported_symbols=imported_symbols)
|
||||||
|
|
||||||
node = self.graph.add(partition, path, elf)
|
node = self.graph.add_lib(partition, path, elf)
|
||||||
setattr(self, name + '_' + elf.elf_class_name, node)
|
setattr(self, name + '_' + elf.elf_class_name, node)
|
||||||
return node
|
return node
|
||||||
|
|
||||||
@@ -95,23 +95,23 @@ class ELFLinkerTest(unittest.TestCase):
|
|||||||
def _get_paths_from_nodes(self, nodes):
|
def _get_paths_from_nodes(self, nodes):
|
||||||
return sorted([node.path for node in nodes])
|
return sorted([node.path for node in nodes])
|
||||||
|
|
||||||
def test_map_path_to_lib(self):
|
def test_get_lib(self):
|
||||||
gb = self._create_normal_graph()
|
gb = self._create_normal_graph()
|
||||||
graph = gb.graph
|
graph = gb.graph
|
||||||
|
|
||||||
node = graph.map_path_to_lib('/system/lib/libc.so')
|
node = graph.get_lib('/system/lib/libc.so')
|
||||||
self.assertEqual(gb.libc_32, node)
|
self.assertEqual(gb.libc_32, node)
|
||||||
self.assertEqual('/system/lib/libc.so', node.path)
|
self.assertEqual('/system/lib/libc.so', node.path)
|
||||||
|
|
||||||
node = graph.map_path_to_lib('/system/lib64/libdl.so')
|
node = graph.get_lib('/system/lib64/libdl.so')
|
||||||
self.assertEqual(gb.libdl_64, node)
|
self.assertEqual(gb.libdl_64, node)
|
||||||
self.assertEqual('/system/lib64/libdl.so', node.path)
|
self.assertEqual('/system/lib64/libdl.so', node.path)
|
||||||
|
|
||||||
node = graph.map_path_to_lib('/vendor/lib64/libEGL.so')
|
node = graph.get_lib('/vendor/lib64/libEGL.so')
|
||||||
self.assertEqual(gb.libEGL_64, node)
|
self.assertEqual(gb.libEGL_64, node)
|
||||||
self.assertEqual('/vendor/lib64/libEGL.so', node.path)
|
self.assertEqual('/vendor/lib64/libEGL.so', node.path)
|
||||||
|
|
||||||
self.assertEqual(None, graph.map_path_to_lib('/no/such/path.so'))
|
self.assertEqual(None, graph.get_lib('/no/such/path.so'))
|
||||||
|
|
||||||
def test_map_paths_to_libs(self):
|
def test_map_paths_to_libs(self):
|
||||||
gb = self._create_normal_graph()
|
gb = self._create_normal_graph()
|
||||||
@@ -119,7 +119,7 @@ class ELFLinkerTest(unittest.TestCase):
|
|||||||
|
|
||||||
bad = []
|
bad = []
|
||||||
paths = ['/system/lib/libc.so', '/system/lib/libdl.so']
|
paths = ['/system/lib/libc.so', '/system/lib/libdl.so']
|
||||||
nodes = graph.map_paths_to_libs(paths, bad.append)
|
nodes = graph.get_libs(paths, bad.append)
|
||||||
|
|
||||||
self.assertEqual([], bad)
|
self.assertEqual([], bad)
|
||||||
self.assertEqual(2, len(nodes))
|
self.assertEqual(2, len(nodes))
|
||||||
@@ -127,7 +127,7 @@ class ELFLinkerTest(unittest.TestCase):
|
|||||||
|
|
||||||
bad = []
|
bad = []
|
||||||
paths = ['/no/such/path.so', '/system/lib64/libdl.so']
|
paths = ['/no/such/path.so', '/system/lib64/libdl.so']
|
||||||
nodes = graph.map_paths_to_libs(paths, bad.append)
|
nodes = graph.get_libs(paths, bad.append)
|
||||||
self.assertEqual(['/no/such/path.so'], bad)
|
self.assertEqual(['/no/such/path.so'], bad)
|
||||||
self.assertEqual(['/system/lib64/libdl.so'],
|
self.assertEqual(['/system/lib64/libdl.so'],
|
||||||
self._get_paths_from_nodes(nodes))
|
self._get_paths_from_nodes(nodes))
|
||||||
@@ -149,17 +149,17 @@ class ELFLinkerTest(unittest.TestCase):
|
|||||||
graph = gb.graph
|
graph = gb.graph
|
||||||
|
|
||||||
# Check the dependencies of libc.so.
|
# Check the dependencies of libc.so.
|
||||||
node = gb.graph.map_path_to_lib('/system/lib/libc.so')
|
node = gb.graph.get_lib('/system/lib/libc.so')
|
||||||
self.assertEqual(['/system/lib/libdl.so', '/system/lib/libm.so'],
|
self.assertEqual(['/system/lib/libdl.so', '/system/lib/libm.so'],
|
||||||
self._get_paths_from_nodes(node.deps))
|
self._get_paths_from_nodes(node.deps))
|
||||||
|
|
||||||
# Check the dependencies of libRS.so.
|
# Check the dependencies of libRS.so.
|
||||||
node = gb.graph.map_path_to_lib('/system/lib64/libRS.so')
|
node = gb.graph.get_lib('/system/lib64/libRS.so')
|
||||||
self.assertEqual(['/system/lib64/libdl.so'],
|
self.assertEqual(['/system/lib64/libdl.so'],
|
||||||
self._get_paths_from_nodes(node.deps))
|
self._get_paths_from_nodes(node.deps))
|
||||||
|
|
||||||
# Check the dependencies of libEGL.so.
|
# Check the dependencies of libEGL.so.
|
||||||
node = gb.graph.map_path_to_lib('/vendor/lib64/libEGL.so')
|
node = gb.graph.get_lib('/vendor/lib64/libEGL.so')
|
||||||
self.assertEqual(['/system/lib64/libc.so', '/system/lib64/libcutils.so',
|
self.assertEqual(['/system/lib64/libc.so', '/system/lib64/libcutils.so',
|
||||||
'/system/lib64/libdl.so'],
|
'/system/lib64/libdl.so'],
|
||||||
self._get_paths_from_nodes(node.deps))
|
self._get_paths_from_nodes(node.deps))
|
||||||
@@ -175,13 +175,13 @@ class ELFLinkerTest(unittest.TestCase):
|
|||||||
|
|
||||||
# Check the linked symbols.
|
# Check the linked symbols.
|
||||||
for lib in ('lib', 'lib64'):
|
for lib in ('lib', 'lib64'):
|
||||||
libdl = graph.map_path_to_lib('/system/' + lib + '/libdl.so')
|
libdl = graph.get_lib('/system/' + lib + '/libdl.so')
|
||||||
libm = graph.map_path_to_lib('/system/' + lib + '/libm.so')
|
libm = graph.get_lib('/system/' + lib + '/libm.so')
|
||||||
libc = graph.map_path_to_lib('/system/' + lib + '/libc.so')
|
libc = graph.get_lib('/system/' + lib + '/libc.so')
|
||||||
libRS = graph.map_path_to_lib('/system/' + lib + '/libRS.so')
|
libRS = graph.get_lib('/system/' + lib + '/libRS.so')
|
||||||
libcutils = \
|
libcutils = \
|
||||||
graph.map_path_to_lib('/system/' + lib + '/libcutils.so')
|
graph.get_lib('/system/' + lib + '/libcutils.so')
|
||||||
libEGL = graph.map_path_to_lib('/vendor/' + lib + '/libEGL.so')
|
libEGL = graph.get_lib('/vendor/' + lib + '/libEGL.so')
|
||||||
|
|
||||||
# Check the linked symbols for libc.so.
|
# Check the linked symbols for libc.so.
|
||||||
self.assertIs(libdl, libc.linked_symbols['dlclose'])
|
self.assertIs(libdl, libc.linked_symbols['dlclose'])
|
||||||
@@ -211,7 +211,7 @@ class ELFLinkerTest(unittest.TestCase):
|
|||||||
imported_symbols={'__does_not_exist'})
|
imported_symbols={'__does_not_exist'})
|
||||||
gb.resolve()
|
gb.resolve()
|
||||||
|
|
||||||
lib = gb.graph.map_path_to_lib('/system/lib64/libfoo.so')
|
lib = gb.graph.get_lib('/system/lib64/libfoo.so')
|
||||||
self.assertEqual({'__does_not_exist'}, lib.unresolved_symbols)
|
self.assertEqual({'__does_not_exist'}, lib.unresolved_symbols)
|
||||||
|
|
||||||
def test_users(self):
|
def test_users(self):
|
||||||
@@ -219,22 +219,22 @@ class ELFLinkerTest(unittest.TestCase):
|
|||||||
graph = gb.graph
|
graph = gb.graph
|
||||||
|
|
||||||
# Check the users of libc.so.
|
# Check the users of libc.so.
|
||||||
node = graph.map_path_to_lib('/system/lib/libc.so')
|
node = graph.get_lib('/system/lib/libc.so')
|
||||||
self.assertEqual(['/system/lib/libcutils.so', '/vendor/lib/libEGL.so'],
|
self.assertEqual(['/system/lib/libcutils.so', '/vendor/lib/libEGL.so'],
|
||||||
self._get_paths_from_nodes(node.users))
|
self._get_paths_from_nodes(node.users))
|
||||||
|
|
||||||
# Check the users of libdl.so.
|
# Check the users of libdl.so.
|
||||||
node = graph.map_path_to_lib('/system/lib/libdl.so')
|
node = graph.get_lib('/system/lib/libdl.so')
|
||||||
self.assertEqual(['/system/lib/libRS.so', '/system/lib/libc.so',
|
self.assertEqual(['/system/lib/libRS.so', '/system/lib/libc.so',
|
||||||
'/system/lib/libcutils.so', '/vendor/lib/libEGL.so'],
|
'/system/lib/libcutils.so', '/vendor/lib/libEGL.so'],
|
||||||
self._get_paths_from_nodes(node.users))
|
self._get_paths_from_nodes(node.users))
|
||||||
|
|
||||||
# Check the users of libRS.so.
|
# Check the users of libRS.so.
|
||||||
node = graph.map_path_to_lib('/system/lib64/libRS.so')
|
node = graph.get_lib('/system/lib64/libRS.so')
|
||||||
self.assertEqual([], self._get_paths_from_nodes(node.users))
|
self.assertEqual([], self._get_paths_from_nodes(node.users))
|
||||||
|
|
||||||
# Check the users of libEGL.so.
|
# Check the users of libEGL.so.
|
||||||
node = graph.map_path_to_lib('/vendor/lib64/libEGL.so')
|
node = graph.get_lib('/vendor/lib64/libEGL.so')
|
||||||
self.assertEqual([], self._get_paths_from_nodes(node.users))
|
self.assertEqual([], self._get_paths_from_nodes(node.users))
|
||||||
|
|
||||||
def test_compute_vndk_stable(self):
|
def test_compute_vndk_stable(self):
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ class ELFLinkerVNDKTest(unittest.TestCase):
|
|||||||
def is_banned(self, name):
|
def is_banned(self, name):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
generic_refs_dir = os.path.join(TESTDATA_DIR, 'vndk_ext_ref')
|
generic_refs_dir = os.path.join(TESTDATA_DIR, 'vndk_gr')
|
||||||
|
|
||||||
generic_refs = GenericRefs.create_from_dir(generic_refs_dir)
|
generic_refs = GenericRefs.create_from_dir(generic_refs_dir)
|
||||||
|
|
||||||
@@ -70,8 +70,8 @@ class ELFLinkerVNDKTest(unittest.TestCase):
|
|||||||
'/system/lib64/vndk/libRS.so',
|
'/system/lib64/vndk/libRS.so',
|
||||||
'/system/lib64/vndk/libcutils.so'],
|
'/system/lib64/vndk/libcutils.so'],
|
||||||
self._get_paths_from_nodes(vndk.vndk_core))
|
self._get_paths_from_nodes(vndk.vndk_core))
|
||||||
self.assertEqual(['/system/lib/libRS.so',
|
self.assertEqual(['/system/lib/vndk-ext/libRS.so',
|
||||||
'/system/lib64/libRS.so'],
|
'/system/lib64/vndk-ext/libRS.so'],
|
||||||
self._get_paths_from_nodes(vndk.vndk_fwk_ext))
|
self._get_paths_from_nodes(vndk.vndk_fwk_ext))
|
||||||
self.assertEqual([], self._get_paths_from_nodes(vndk.vndk_vnd_ext))
|
self.assertEqual([], self._get_paths_from_nodes(vndk.vndk_vnd_ext))
|
||||||
|
|
||||||
@@ -80,7 +80,7 @@ class ELFLinkerVNDKTest(unittest.TestCase):
|
|||||||
def is_banned(self, name):
|
def is_banned(self, name):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
generic_refs_dir = os.path.join(TESTDATA_DIR, 'vndk_ext_ref')
|
generic_refs_dir = os.path.join(TESTDATA_DIR, 'vndk_gr')
|
||||||
|
|
||||||
generic_refs = GenericRefs.create_from_dir(generic_refs_dir)
|
generic_refs = GenericRefs.create_from_dir(generic_refs_dir)
|
||||||
|
|
||||||
@@ -103,9 +103,113 @@ class ELFLinkerVNDKTest(unittest.TestCase):
|
|||||||
'/system/lib64/vndk/libcutils.so'],
|
'/system/lib64/vndk/libcutils.so'],
|
||||||
self._get_paths_from_nodes(vndk.vndk_core))
|
self._get_paths_from_nodes(vndk.vndk_core))
|
||||||
self.assertEqual([], self._get_paths_from_nodes(vndk.vndk_fwk_ext))
|
self.assertEqual([], self._get_paths_from_nodes(vndk.vndk_fwk_ext))
|
||||||
self.assertEqual(['/system/lib/libRS.so', '/system/lib64/libRS.so'],
|
self.assertEqual(['/vendor/lib/vndk-ext/libRS.so',
|
||||||
|
'/vendor/lib64/vndk-ext/libRS.so'],
|
||||||
self._get_paths_from_nodes(vndk.vndk_vnd_ext))
|
self._get_paths_from_nodes(vndk.vndk_vnd_ext))
|
||||||
|
|
||||||
|
def test_compute_vndk_inward_customization(self):
|
||||||
|
class MockBannedLibs(object):
|
||||||
|
def is_banned(self, name):
|
||||||
|
return False
|
||||||
|
|
||||||
|
generic_refs_dir = os.path.join(TESTDATA_DIR, 'vndk_gr')
|
||||||
|
|
||||||
|
generic_refs = GenericRefs.create_from_dir(generic_refs_dir)
|
||||||
|
|
||||||
|
input_dir = os.path.join(TESTDATA_DIR, 'vndk_inward_customization')
|
||||||
|
|
||||||
|
graph = ELFLinker.create_from_dump(
|
||||||
|
system_dirs=[os.path.join(input_dir, 'system')],
|
||||||
|
vendor_dirs=[os.path.join(input_dir, 'vendor')],
|
||||||
|
generic_refs=generic_refs)
|
||||||
|
|
||||||
|
# Make sure libjpeg.so was loaded from the input dir.
|
||||||
|
libjpeg_32 = graph.get_lib('/system/lib/libjpeg.so')
|
||||||
|
self.assertIsNotNone(libjpeg_32)
|
||||||
|
libjpeg_64 = graph.get_lib('/system/lib64/libjpeg.so')
|
||||||
|
self.assertIsNotNone(libjpeg_64)
|
||||||
|
|
||||||
|
# Compute vndk sets and move libraries to the correct directories.
|
||||||
|
vndk = graph.compute_vndk(sp_hals=set(), vndk_stable=set(),
|
||||||
|
vndk_customized_for_system=set(),
|
||||||
|
vndk_customized_for_vendor=set(),
|
||||||
|
generic_refs=generic_refs,
|
||||||
|
banned_libs=MockBannedLibs())
|
||||||
|
|
||||||
|
# Check vndk-core libraries.
|
||||||
|
self.assertEqual(['/system/lib/vndk/libRS.so',
|
||||||
|
'/system/lib/vndk/libcutils.so',
|
||||||
|
'/system/lib64/vndk/libRS.so',
|
||||||
|
'/system/lib64/vndk/libcutils.so'],
|
||||||
|
self._get_paths_from_nodes(vndk.vndk_core))
|
||||||
|
|
||||||
|
# Check vndk-indirect libraries.
|
||||||
|
self.assertEqual(['/system/lib/vndk/libjpeg.so',
|
||||||
|
'/system/lib64/vndk/libjpeg.so'],
|
||||||
|
self._get_paths_from_nodes(vndk.vndk_indirect))
|
||||||
|
|
||||||
|
# Check libjpeg.so (inward-customization) has been renamed.
|
||||||
|
self.assertIsNone(graph.get_lib('/system/lib/libjpeg.so'))
|
||||||
|
self.assertIsNone(graph.get_lib('/system/lib64/libjpeg.so'))
|
||||||
|
self.assertIs(libjpeg_32,
|
||||||
|
graph.get_lib('/system/lib/vndk/libjpeg.so'))
|
||||||
|
self.assertIs(libjpeg_64,
|
||||||
|
graph.get_lib('/system/lib64/vndk/libjpeg.so'))
|
||||||
|
|
||||||
|
# Check the absence of vndk-ext libraries.
|
||||||
|
self.assertEqual([], self._get_paths_from_nodes(vndk.vndk_fwk_ext))
|
||||||
|
self.assertEqual([], self._get_paths_from_nodes(vndk.vndk_vnd_ext))
|
||||||
|
|
||||||
|
def test_compute_vndk_indirect_ext(self):
|
||||||
|
class MockBannedLibs(object):
|
||||||
|
def is_banned(self, name):
|
||||||
|
return False
|
||||||
|
|
||||||
|
# This test case reveals a corner case that will break vndk-indirect
|
||||||
|
# computation. To reproduce the case, the following condition must be
|
||||||
|
# satisfied:
|
||||||
|
#
|
||||||
|
# 1. libA depends on libB.
|
||||||
|
# 2. libA is a vndk-fwk-ext.
|
||||||
|
# 3. libB is an outward-customized vndk which depends on non-AOSP libC.
|
||||||
|
#
|
||||||
|
# Both AOSP libA and libB will be added to vndk-core. But,
|
||||||
|
# unfortunately, libA will be resolved to libB in vndk-fwk-ext and this
|
||||||
|
# will break the vndk-indirect computation because libC is not in
|
||||||
|
# generic references.
|
||||||
|
|
||||||
|
generic_refs_dir = os.path.join(TESTDATA_DIR, 'vndk_indirect_ext_gr')
|
||||||
|
|
||||||
|
generic_refs = GenericRefs.create_from_dir(generic_refs_dir)
|
||||||
|
|
||||||
|
input_dir = os.path.join(TESTDATA_DIR, 'vndk_indirect_ext')
|
||||||
|
|
||||||
|
graph = ELFLinker.create_from_dump(
|
||||||
|
system_dirs=[os.path.join(input_dir, 'system')],
|
||||||
|
vendor_dirs=[os.path.join(input_dir, 'vendor')],
|
||||||
|
generic_refs=generic_refs)
|
||||||
|
|
||||||
|
vndk = graph.compute_vndk(sp_hals=set(), vndk_stable=set(),
|
||||||
|
vndk_customized_for_system=set(),
|
||||||
|
vndk_customized_for_vendor=set(),
|
||||||
|
generic_refs=generic_refs,
|
||||||
|
banned_libs=MockBannedLibs())
|
||||||
|
|
||||||
|
self.assertEqual(['/system/lib/vndk/libRS.so',
|
||||||
|
'/system/lib/vndk/libcutils.so',
|
||||||
|
'/system/lib64/vndk/libRS.so',
|
||||||
|
'/system/lib64/vndk/libcutils.so'],
|
||||||
|
self._get_paths_from_nodes(vndk.vndk_core))
|
||||||
|
|
||||||
|
self.assertEqual(['/system/lib/vndk/libRS_internal.so',
|
||||||
|
'/system/lib64/vndk/libRS_internal.so'],
|
||||||
|
self._get_paths_from_nodes(vndk.vndk_indirect))
|
||||||
|
|
||||||
|
self.assertEqual(['/system/lib/vndk-ext/libRS_internal.so',
|
||||||
|
'/system/lib64/vndk-ext/libRS_internal.so'],
|
||||||
|
self._get_paths_from_nodes(vndk.vndk_fwk_ext))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|||||||
8
vndk/tools/definition-tool/tests/testdata/test_vndk/vndk_gr/system/lib/libjpeg.so.sym
vendored
Normal file
8
vndk/tools/definition-tool/tests/testdata/test_vndk/vndk_gr/system/lib/libjpeg.so.sym
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
EI_CLASS 32
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_ARM
|
||||||
|
DT_NEEDED libdl.so
|
||||||
|
DT_NEEDED libc.so
|
||||||
|
DT_NEEDED libm.so
|
||||||
|
EXP_SYMBOL jpeg_CreateCompress
|
||||||
|
EXP_SYMBOL jpeg_CreateDecompress
|
||||||
8
vndk/tools/definition-tool/tests/testdata/test_vndk/vndk_gr/system/lib64/libjpeg.so.sym
vendored
Normal file
8
vndk/tools/definition-tool/tests/testdata/test_vndk/vndk_gr/system/lib64/libjpeg.so.sym
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
EI_CLASS 64
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_AARCH64
|
||||||
|
DT_NEEDED libdl.so
|
||||||
|
DT_NEEDED libc.so
|
||||||
|
DT_NEEDED libm.so
|
||||||
|
EXP_SYMBOL jpeg_CreateCompress
|
||||||
|
EXP_SYMBOL jpeg_CreateDecompress
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
EI_CLASS 32
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_ARM
|
||||||
|
DT_NEEDED libdl.so
|
||||||
|
DT_NEEDED libRS_internal.so
|
||||||
|
EXP_SYMBOL rsContextCreate
|
||||||
|
IMP_SYMBOL dlclose
|
||||||
|
IMP_SYMBOL dlopen
|
||||||
|
IMP_SYMBOL dlsym
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
EI_CLASS 32
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_ARM
|
||||||
|
DT_NEEDED libdl.so
|
||||||
|
DT_NEEDED libRS_internal_vendor.so
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
EI_CLASS 32
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_ARM
|
||||||
|
DT_NEEDED libdl.so
|
||||||
12
vndk/tools/definition-tool/tests/testdata/test_vndk/vndk_indirect_ext/system/lib/libc.so.sym
vendored
Normal file
12
vndk/tools/definition-tool/tests/testdata/test_vndk/vndk_indirect_ext/system/lib/libc.so.sym
vendored
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
EI_CLASS 32
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_ARM
|
||||||
|
DT_NEEDED libdl.so
|
||||||
|
DT_NEEDED libm.so
|
||||||
|
EXP_SYMBOL fclose
|
||||||
|
EXP_SYMBOL fopen
|
||||||
|
EXP_SYMBOL fread
|
||||||
|
IMP_SYMBOL dlclose
|
||||||
|
IMP_SYMBOL dlopen
|
||||||
|
IMP_SYMBOL cos
|
||||||
|
IMP_SYMBOL sin
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
EI_CLASS 32
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_ARM
|
||||||
|
DT_NEEDED libc.so
|
||||||
|
DT_NEEDED libdl.so
|
||||||
|
IMP_SYMBOL dlclose
|
||||||
|
IMP_SYMBOL dlopen
|
||||||
|
IMP_SYMBOL fclose
|
||||||
|
IMP_SYMBOL fopen
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
EI_CLASS 32
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_ARM
|
||||||
|
EXP_SYMBOL dlclose
|
||||||
|
EXP_SYMBOL dlopen
|
||||||
|
EXP_SYMBOL dlsym
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
EI_CLASS 32
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_ARM
|
||||||
|
DT_NEEDED libdl.so
|
||||||
|
DT_NEEDED libc.so
|
||||||
|
DT_NEEDED libm.so
|
||||||
|
EXP_SYMBOL jpeg_CreateCompress
|
||||||
|
EXP_SYMBOL jpeg_CreateDecompress
|
||||||
5
vndk/tools/definition-tool/tests/testdata/test_vndk/vndk_indirect_ext/system/lib/libm.so.sym
vendored
Normal file
5
vndk/tools/definition-tool/tests/testdata/test_vndk/vndk_indirect_ext/system/lib/libm.so.sym
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
EI_CLASS 32
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_ARM
|
||||||
|
EXP_SYMBOL cos
|
||||||
|
EXP_SYMBOL sin
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
EI_CLASS 64
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_AARCH64
|
||||||
|
DT_NEEDED libdl.so
|
||||||
|
DT_NEEDED libRS_internal.so
|
||||||
|
EXP_SYMBOL rsContextCreate
|
||||||
|
IMP_SYMBOL dlclose
|
||||||
|
IMP_SYMBOL dlopen
|
||||||
|
IMP_SYMBOL dlsym
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
EI_CLASS 64
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_AARCH64
|
||||||
|
DT_NEEDED libdl.so
|
||||||
|
DT_NEEDED libRS_internal_vendor.so
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
EI_CLASS 64
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_AARCH64
|
||||||
|
DT_NEEDED libdl.so
|
||||||
12
vndk/tools/definition-tool/tests/testdata/test_vndk/vndk_indirect_ext/system/lib64/libc.so.sym
vendored
Normal file
12
vndk/tools/definition-tool/tests/testdata/test_vndk/vndk_indirect_ext/system/lib64/libc.so.sym
vendored
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
EI_CLASS 64
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_AARCH64
|
||||||
|
DT_NEEDED libdl.so
|
||||||
|
DT_NEEDED libm.so
|
||||||
|
EXP_SYMBOL fclose
|
||||||
|
EXP_SYMBOL fopen
|
||||||
|
EXP_SYMBOL fread
|
||||||
|
IMP_SYMBOL dlclose
|
||||||
|
IMP_SYMBOL dlopen
|
||||||
|
IMP_SYMBOL cos
|
||||||
|
IMP_SYMBOL sin
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
EI_CLASS 64
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_AARCH64
|
||||||
|
DT_NEEDED libc.so
|
||||||
|
DT_NEEDED libdl.so
|
||||||
|
IMP_SYMBOL dlclose
|
||||||
|
IMP_SYMBOL dlopen
|
||||||
|
IMP_SYMBOL fclose
|
||||||
|
IMP_SYMBOL fopen
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
EI_CLASS 64
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_AARCH64
|
||||||
|
EXP_SYMBOL dlclose
|
||||||
|
EXP_SYMBOL dlopen
|
||||||
|
EXP_SYMBOL dlsym
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
EI_CLASS 64
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_AARCH64
|
||||||
|
DT_NEEDED libdl.so
|
||||||
|
DT_NEEDED libc.so
|
||||||
|
DT_NEEDED libm.so
|
||||||
|
EXP_SYMBOL jpeg_CreateCompress
|
||||||
|
EXP_SYMBOL jpeg_CreateDecompress
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
EI_CLASS 64
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_AARCH64
|
||||||
|
EXP_SYMBOL cos
|
||||||
|
EXP_SYMBOL sin
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
EI_CLASS 32
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_ARM
|
||||||
|
DT_NEEDED libc.so
|
||||||
|
DT_NEEDED libcutils.so
|
||||||
|
DT_NEEDED libdl.so
|
||||||
|
EXP_SYMBOL eglGetDisplay
|
||||||
|
IMP_SYMBOL fclose
|
||||||
|
IMP_SYMBOL fopen
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
EI_CLASS 32
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_ARM
|
||||||
|
DT_NEEDED libRS.so
|
||||||
|
IMP_SYMBOL rsContextCreate
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
EI_CLASS 64
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_AARCH64
|
||||||
|
DT_NEEDED libc.so
|
||||||
|
DT_NEEDED libcutils.so
|
||||||
|
DT_NEEDED libdl.so
|
||||||
|
EXP_SYMBOL eglGetDisplay
|
||||||
|
IMP_SYMBOL fclose
|
||||||
|
IMP_SYMBOL fopen
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
EI_CLASS 64
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_AARCH64
|
||||||
|
DT_NEEDED libRS.so
|
||||||
|
IMP_SYMBOL rsContextCreate
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
EI_CLASS 32
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_ARM
|
||||||
|
DT_NEEDED libdl.so
|
||||||
|
DT_NEEDED libRS_internal.so
|
||||||
|
EXP_SYMBOL rsContextCreate
|
||||||
|
IMP_SYMBOL dlclose
|
||||||
|
IMP_SYMBOL dlopen
|
||||||
|
IMP_SYMBOL dlsym
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
EI_CLASS 32
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_ARM
|
||||||
|
DT_NEEDED libdl.so
|
||||||
12
vndk/tools/definition-tool/tests/testdata/test_vndk/vndk_indirect_ext_gr/system/lib/libc.so.sym
vendored
Normal file
12
vndk/tools/definition-tool/tests/testdata/test_vndk/vndk_indirect_ext_gr/system/lib/libc.so.sym
vendored
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
EI_CLASS 32
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_ARM
|
||||||
|
DT_NEEDED libdl.so
|
||||||
|
DT_NEEDED libm.so
|
||||||
|
EXP_SYMBOL fclose
|
||||||
|
EXP_SYMBOL fopen
|
||||||
|
EXP_SYMBOL fread
|
||||||
|
IMP_SYMBOL dlclose
|
||||||
|
IMP_SYMBOL dlopen
|
||||||
|
IMP_SYMBOL cos
|
||||||
|
IMP_SYMBOL sin
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
EI_CLASS 32
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_ARM
|
||||||
|
DT_NEEDED libc.so
|
||||||
|
DT_NEEDED libdl.so
|
||||||
|
IMP_SYMBOL dlclose
|
||||||
|
IMP_SYMBOL dlopen
|
||||||
|
IMP_SYMBOL fclose
|
||||||
|
IMP_SYMBOL fopen
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
EI_CLASS 32
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_ARM
|
||||||
|
EXP_SYMBOL dlclose
|
||||||
|
EXP_SYMBOL dlopen
|
||||||
|
EXP_SYMBOL dlsym
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
EI_CLASS 32
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_ARM
|
||||||
|
DT_NEEDED libdl.so
|
||||||
|
DT_NEEDED libc.so
|
||||||
|
DT_NEEDED libm.so
|
||||||
|
EXP_SYMBOL jpeg_CreateCompress
|
||||||
|
EXP_SYMBOL jpeg_CreateDecompress
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
EI_CLASS 32
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_ARM
|
||||||
|
EXP_SYMBOL cos
|
||||||
|
EXP_SYMBOL sin
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
EI_CLASS 64
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_AARCH64
|
||||||
|
DT_NEEDED libdl.so
|
||||||
|
DT_NEEDED libRS_internal.so
|
||||||
|
EXP_SYMBOL rsContextCreate
|
||||||
|
IMP_SYMBOL dlclose
|
||||||
|
IMP_SYMBOL dlopen
|
||||||
|
IMP_SYMBOL dlsym
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
EI_CLASS 64
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_AARCH64
|
||||||
|
DT_NEEDED libdl.so
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
EI_CLASS 64
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_AARCH64
|
||||||
|
DT_NEEDED libdl.so
|
||||||
|
DT_NEEDED libm.so
|
||||||
|
EXP_SYMBOL fclose
|
||||||
|
EXP_SYMBOL fopen
|
||||||
|
EXP_SYMBOL fread
|
||||||
|
IMP_SYMBOL dlclose
|
||||||
|
IMP_SYMBOL dlopen
|
||||||
|
IMP_SYMBOL cos
|
||||||
|
IMP_SYMBOL sin
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
EI_CLASS 64
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_AARCH64
|
||||||
|
DT_NEEDED libc.so
|
||||||
|
DT_NEEDED libdl.so
|
||||||
|
IMP_SYMBOL dlclose
|
||||||
|
IMP_SYMBOL dlopen
|
||||||
|
IMP_SYMBOL fclose
|
||||||
|
IMP_SYMBOL fopen
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
EI_CLASS 64
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_AARCH64
|
||||||
|
EXP_SYMBOL dlclose
|
||||||
|
EXP_SYMBOL dlopen
|
||||||
|
EXP_SYMBOL dlsym
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
EI_CLASS 64
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_AARCH64
|
||||||
|
DT_NEEDED libdl.so
|
||||||
|
DT_NEEDED libc.so
|
||||||
|
DT_NEEDED libm.so
|
||||||
|
EXP_SYMBOL jpeg_CreateCompress
|
||||||
|
EXP_SYMBOL jpeg_CreateDecompress
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
EI_CLASS 64
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_AARCH64
|
||||||
|
EXP_SYMBOL cos
|
||||||
|
EXP_SYMBOL sin
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
EI_CLASS 32
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_ARM
|
||||||
|
DT_NEEDED libc.so
|
||||||
|
DT_NEEDED libcutils.so
|
||||||
|
DT_NEEDED libdl.so
|
||||||
|
EXP_SYMBOL eglGetDisplay
|
||||||
|
IMP_SYMBOL fclose
|
||||||
|
IMP_SYMBOL fopen
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
EI_CLASS 64
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_AARCH64
|
||||||
|
DT_NEEDED libc.so
|
||||||
|
DT_NEEDED libcutils.so
|
||||||
|
DT_NEEDED libdl.so
|
||||||
|
EXP_SYMBOL eglGetDisplay
|
||||||
|
IMP_SYMBOL fclose
|
||||||
|
IMP_SYMBOL fopen
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
EI_CLASS 32
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_ARM
|
||||||
|
DT_NEEDED libdl.so
|
||||||
|
DT_NEEDED libjpeg.so
|
||||||
|
EXP_SYMBOL rsContextCreate
|
||||||
|
IMP_SYMBOL dlclose
|
||||||
|
IMP_SYMBOL dlopen
|
||||||
|
IMP_SYMBOL dlsym
|
||||||
|
IMP_SYMBOL jpeg_CreateCompress
|
||||||
|
IMP_SYMBOL jpeg_CreateDecompress
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
EI_CLASS 32
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_ARM
|
||||||
|
DT_NEEDED libRS.so
|
||||||
|
IMP_SYMBOL rsContextCreate
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
EI_CLASS 32
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_ARM
|
||||||
|
DT_NEEDED libdl.so
|
||||||
|
DT_NEEDED libm.so
|
||||||
|
EXP_SYMBOL fclose
|
||||||
|
EXP_SYMBOL fopen
|
||||||
|
EXP_SYMBOL fread
|
||||||
|
IMP_SYMBOL dlclose
|
||||||
|
IMP_SYMBOL dlopen
|
||||||
|
IMP_SYMBOL cos
|
||||||
|
IMP_SYMBOL sin
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
EI_CLASS 32
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_ARM
|
||||||
|
DT_NEEDED libc.so
|
||||||
|
DT_NEEDED libdl.so
|
||||||
|
IMP_SYMBOL dlclose
|
||||||
|
IMP_SYMBOL dlopen
|
||||||
|
IMP_SYMBOL fclose
|
||||||
|
IMP_SYMBOL fopen
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
EI_CLASS 32
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_ARM
|
||||||
|
EXP_SYMBOL dlclose
|
||||||
|
EXP_SYMBOL dlopen
|
||||||
|
EXP_SYMBOL dlsym
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
EI_CLASS 32
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_ARM
|
||||||
|
DT_NEEDED libdl.so
|
||||||
|
DT_NEEDED libc.so
|
||||||
|
DT_NEEDED libm.so
|
||||||
|
EXP_SYMBOL jpeg_CreateCompress
|
||||||
|
EXP_SYMBOL jpeg_CreateDecompress
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
EI_CLASS 32
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_ARM
|
||||||
|
EXP_SYMBOL cos
|
||||||
|
EXP_SYMBOL sin
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
EI_CLASS 64
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_AARCH64
|
||||||
|
DT_NEEDED libdl.so
|
||||||
|
DT_NEEDED libjpeg.so
|
||||||
|
EXP_SYMBOL rsContextCreate
|
||||||
|
IMP_SYMBOL dlclose
|
||||||
|
IMP_SYMBOL dlopen
|
||||||
|
IMP_SYMBOL dlsym
|
||||||
|
IMP_SYMBOL jpeg_CreateCompress
|
||||||
|
IMP_SYMBOL jpeg_CreateDecompress
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
EI_CLASS 64
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_AARCH64
|
||||||
|
DT_NEEDED libRS.so
|
||||||
|
IMP_SYMBOL rsContextCreate
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
EI_CLASS 64
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_AARCH64
|
||||||
|
DT_NEEDED libdl.so
|
||||||
|
DT_NEEDED libm.so
|
||||||
|
EXP_SYMBOL fclose
|
||||||
|
EXP_SYMBOL fopen
|
||||||
|
EXP_SYMBOL fread
|
||||||
|
IMP_SYMBOL dlclose
|
||||||
|
IMP_SYMBOL dlopen
|
||||||
|
IMP_SYMBOL cos
|
||||||
|
IMP_SYMBOL sin
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
EI_CLASS 64
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_AARCH64
|
||||||
|
DT_NEEDED libc.so
|
||||||
|
DT_NEEDED libdl.so
|
||||||
|
IMP_SYMBOL dlclose
|
||||||
|
IMP_SYMBOL dlopen
|
||||||
|
IMP_SYMBOL fclose
|
||||||
|
IMP_SYMBOL fopen
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
EI_CLASS 64
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_AARCH64
|
||||||
|
EXP_SYMBOL dlclose
|
||||||
|
EXP_SYMBOL dlopen
|
||||||
|
EXP_SYMBOL dlsym
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
EI_CLASS 64
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_AARCH64
|
||||||
|
DT_NEEDED libdl.so
|
||||||
|
DT_NEEDED libc.so
|
||||||
|
DT_NEEDED libm.so
|
||||||
|
EXP_SYMBOL jpeg_CreateCompress
|
||||||
|
EXP_SYMBOL jpeg_CreateDecompress
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
EI_CLASS 64
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_AARCH64
|
||||||
|
EXP_SYMBOL cos
|
||||||
|
EXP_SYMBOL sin
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
EI_CLASS 32
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_ARM
|
||||||
|
DT_NEEDED libc.so
|
||||||
|
DT_NEEDED libcutils.so
|
||||||
|
DT_NEEDED libdl.so
|
||||||
|
EXP_SYMBOL eglGetDisplay
|
||||||
|
IMP_SYMBOL fclose
|
||||||
|
IMP_SYMBOL fopen
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
EI_CLASS 32
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_ARM
|
||||||
|
DT_NEEDED libRS.so
|
||||||
|
IMP_SYMBOL rsContextCreate
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
EI_CLASS 64
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_AARCH64
|
||||||
|
DT_NEEDED libc.so
|
||||||
|
DT_NEEDED libcutils.so
|
||||||
|
DT_NEEDED libdl.so
|
||||||
|
EXP_SYMBOL eglGetDisplay
|
||||||
|
IMP_SYMBOL fclose
|
||||||
|
IMP_SYMBOL fopen
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
EI_CLASS 64
|
||||||
|
EI_DATA Little-Endian
|
||||||
|
E_MACHINE EM_AARCH64
|
||||||
|
DT_NEEDED libRS.so
|
||||||
|
IMP_SYMBOL rsContextCreate
|
||||||
@@ -661,6 +661,12 @@ class ELFLinkData(object):
|
|||||||
def deps(self):
|
def deps(self):
|
||||||
return itertools.chain.from_iterable(self._deps)
|
return itertools.chain.from_iterable(self._deps)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def deps_with_type(self):
|
||||||
|
dt_deps = zip(self._deps[self.NEEDED], itertools.repeat(self.NEEDED))
|
||||||
|
dl_deps = zip(self._deps[self.DLOPEN], itertools.repeat(self.DLOPEN))
|
||||||
|
return itertools.chain(dt_deps, dl_deps)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def dt_deps(self):
|
def dt_deps(self):
|
||||||
return self._deps[self.NEEDED]
|
return self._deps[self.NEEDED]
|
||||||
@@ -679,6 +685,12 @@ class ELFLinkData(object):
|
|||||||
def users(self):
|
def users(self):
|
||||||
return itertools.chain.from_iterable(self._users)
|
return itertools.chain.from_iterable(self._users)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def users_with_type(self):
|
||||||
|
dt_users = zip(self._users[self.NEEDED], itertools.repeat(self.NEEDED))
|
||||||
|
dl_users = zip(self._users[self.DLOPEN], itertools.repeat(self.DLOPEN))
|
||||||
|
return itertools.chain(dt_users, dl_users)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def dt_users(self):
|
def dt_users(self):
|
||||||
return self._users[self.NEEDED]
|
return self._users[self.NEEDED]
|
||||||
@@ -727,14 +739,30 @@ class ELFLinker(object):
|
|||||||
self.lib32_resolver = ELFResolver(self.lib32, self.LIB32_SEARCH_PATH)
|
self.lib32_resolver = ELFResolver(self.lib32, self.LIB32_SEARCH_PATH)
|
||||||
self.lib64_resolver = ELFResolver(self.lib64, self.LIB64_SEARCH_PATH)
|
self.lib64_resolver = ELFResolver(self.lib64, self.LIB64_SEARCH_PATH)
|
||||||
|
|
||||||
def add(self, partition, path, elf):
|
def _add_lib_to_lookup_dict(self, lib):
|
||||||
node = ELFLinkData(partition, path, elf)
|
if lib.elf.is_32bit:
|
||||||
if elf.is_32bit:
|
self.lib32[lib.path] = lib
|
||||||
self.lib32[path] = node
|
|
||||||
else:
|
else:
|
||||||
self.lib64[path] = node
|
self.lib64[lib.path] = lib
|
||||||
self.lib_pt[partition][path] = node
|
self.lib_pt[lib.partition][lib.path] = lib
|
||||||
return node
|
|
||||||
|
def _remove_lib_from_lookup_dict(self, lib):
|
||||||
|
if lib.elf.is_32bit:
|
||||||
|
del self.lib32[lib.path]
|
||||||
|
else:
|
||||||
|
del self.lib64[lib.path]
|
||||||
|
del self.lib_pt[lib.partition][lib.path]
|
||||||
|
|
||||||
|
def add_lib(self, partition, path, elf):
|
||||||
|
lib = ELFLinkData(partition, path, elf)
|
||||||
|
self._add_lib_to_lookup_dict(lib)
|
||||||
|
return lib
|
||||||
|
|
||||||
|
def rename_lib(self, lib, new_partition, new_path):
|
||||||
|
self._remove_lib_from_lookup_dict(lib)
|
||||||
|
lib.path = new_path
|
||||||
|
lib.partition = new_partition
|
||||||
|
self._add_lib_to_lookup_dict(lib)
|
||||||
|
|
||||||
def add_dep(self, src_path, dst_path, ty):
|
def add_dep(self, src_path, dst_path, ty):
|
||||||
for lib_set in (self.lib32, self.lib64):
|
for lib_set in (self.lib32, self.lib64):
|
||||||
@@ -746,17 +774,17 @@ class ELFLinker(object):
|
|||||||
print('error: cannot add dependency from {} to {}.'
|
print('error: cannot add dependency from {} to {}.'
|
||||||
.format(src_path, dst_path), file=sys.stderr)
|
.format(src_path, dst_path), file=sys.stderr)
|
||||||
|
|
||||||
def map_path_to_lib(self, path):
|
def get_lib(self, path):
|
||||||
for lib_set in (self.lib32, self.lib64):
|
for lib_set in (self.lib32, self.lib64):
|
||||||
lib = lib_set.get(path)
|
lib = lib_set.get(path)
|
||||||
if lib:
|
if lib:
|
||||||
return lib
|
return lib
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def map_paths_to_libs(self, paths, report_error):
|
def get_libs(self, paths, report_error):
|
||||||
result = set()
|
result = set()
|
||||||
for path in paths:
|
for path in paths:
|
||||||
lib = self.map_path_to_lib(path)
|
lib = self.get_lib(path)
|
||||||
if not lib:
|
if not lib:
|
||||||
report_error(path)
|
report_error(path)
|
||||||
continue
|
continue
|
||||||
@@ -780,9 +808,9 @@ class ELFLinker(object):
|
|||||||
for path, elf in scan_elf_files(root):
|
for path, elf in scan_elf_files(root):
|
||||||
short_path = os.path.join('/', partition_name, path[prefix_len:])
|
short_path = os.path.join('/', partition_name, path[prefix_len:])
|
||||||
if alter_subdirs and alter_patt.match(path):
|
if alter_subdirs and alter_patt.match(path):
|
||||||
self.add(alter_partition, short_path, elf)
|
self.add_lib(alter_partition, short_path, elf)
|
||||||
else:
|
else:
|
||||||
self.add(partition, short_path, elf)
|
self.add_lib(partition, short_path, elf)
|
||||||
|
|
||||||
def load_extra_deps(self, path):
|
def load_extra_deps(self, path):
|
||||||
patt = re.compile('([^:]*):\\s*(.*)')
|
patt = re.compile('([^:]*):\\s*(.*)')
|
||||||
@@ -829,7 +857,18 @@ class ELFLinker(object):
|
|||||||
return imported_libs
|
return imported_libs
|
||||||
|
|
||||||
def _resolve_lib_deps(self, lib, resolver, generic_refs):
|
def _resolve_lib_deps(self, lib, resolver, generic_refs):
|
||||||
|
# Resolve DT_NEEDED entries.
|
||||||
imported_libs = self._resolve_lib_dt_needed(lib, resolver)
|
imported_libs = self._resolve_lib_dt_needed(lib, resolver)
|
||||||
|
|
||||||
|
if generic_refs:
|
||||||
|
for imported_lib in imported_libs:
|
||||||
|
if imported_lib.path not in generic_refs.refs:
|
||||||
|
# Add imported_lib to imported_ext_symbols to make sure
|
||||||
|
# non-AOSP libraries are in the imported_ext_symbols key
|
||||||
|
# set.
|
||||||
|
lib.imported_ext_symbols[imported_lib].update()
|
||||||
|
|
||||||
|
# Resolve imported symbols.
|
||||||
self._resolve_lib_imported_symbols(lib, imported_libs, generic_refs)
|
self._resolve_lib_imported_symbols(lib, imported_libs, generic_refs)
|
||||||
|
|
||||||
def _resolve_lib_set_deps(self, lib_set, resolver, generic_refs):
|
def _resolve_lib_set_deps(self, lib_set, resolver, generic_refs):
|
||||||
@@ -1039,6 +1078,40 @@ class ELFLinker(object):
|
|||||||
|
|
||||||
def compute_vndk(self, sp_hals, vndk_stable, vndk_customized_for_system,
|
def compute_vndk(self, sp_hals, vndk_stable, vndk_customized_for_system,
|
||||||
vndk_customized_for_vendor, generic_refs, banned_libs):
|
vndk_customized_for_vendor, generic_refs, banned_libs):
|
||||||
|
# ELF resolvers.
|
||||||
|
VNDK_CORE_SEARCH_PATH32 = (
|
||||||
|
'/system/lib/vndk',
|
||||||
|
'/system/lib',
|
||||||
|
)
|
||||||
|
|
||||||
|
VNDK_CORE_SEARCH_PATH64 = (
|
||||||
|
'/system/lib64/vndk',
|
||||||
|
'/system/lib64',
|
||||||
|
)
|
||||||
|
|
||||||
|
VENDOR_SEARCH_PATH32 = (
|
||||||
|
'/system/lib/vndk',
|
||||||
|
'/vendor/lib',
|
||||||
|
|
||||||
|
# FIXME: Remove following line after we fixed vndk-stable
|
||||||
|
# resolution.
|
||||||
|
'/system/lib',
|
||||||
|
)
|
||||||
|
|
||||||
|
VENDOR_SEARCH_PATH64 = (
|
||||||
|
'/system/lib64/vndk',
|
||||||
|
'/vendor/lib64',
|
||||||
|
|
||||||
|
# FIXME: Remove following line after we fixed vndk-stable
|
||||||
|
# resolution.
|
||||||
|
'/system/lib64',
|
||||||
|
)
|
||||||
|
|
||||||
|
vndk_core_resolver32 = ELFResolver(self.lib32, VNDK_CORE_SEARCH_PATH32)
|
||||||
|
vndk_core_resolver64 = ELFResolver(self.lib64, VNDK_CORE_SEARCH_PATH64)
|
||||||
|
vendor_resolver32 = ELFResolver(self.lib32, VENDOR_SEARCH_PATH32)
|
||||||
|
vendor_resolver64 = ELFResolver(self.lib64, VENDOR_SEARCH_PATH64)
|
||||||
|
|
||||||
# Collect existing VNDK libraries.
|
# Collect existing VNDK libraries.
|
||||||
vndk_core, vndk_fwk_ext, vndk_vnd_ext = self.find_existing_vndk()
|
vndk_core, vndk_fwk_ext, vndk_vnd_ext = self.find_existing_vndk()
|
||||||
|
|
||||||
@@ -1069,21 +1142,39 @@ class ELFLinker(object):
|
|||||||
lib_dir_name = 'lib' if lib.elf.is_32bit else 'lib64'
|
lib_dir_name = 'lib' if lib.elf.is_32bit else 'lib64'
|
||||||
return os.path.join('/system', lib_dir_name, 'vndk', lib_name)
|
return os.path.join('/system', lib_dir_name, 'vndk', lib_name)
|
||||||
|
|
||||||
def add_to_vndk_core(lib):
|
def get_vndk_fwk_ext_lib_name(lib):
|
||||||
|
lib_name = os.path.basename(lib.path)
|
||||||
|
lib_dir_name = 'lib' if lib.elf.is_32bit else 'lib64'
|
||||||
|
return os.path.join('/system', lib_dir_name, 'vndk-ext', lib_name)
|
||||||
|
|
||||||
|
def get_vndk_vnd_ext_lib_name(lib):
|
||||||
|
lib_name = os.path.basename(lib.path)
|
||||||
|
lib_dir_name = 'lib' if lib.elf.is_32bit else 'lib64'
|
||||||
|
return os.path.join('/vendor', lib_dir_name, 'vndk-ext', lib_name)
|
||||||
|
|
||||||
|
def is_valid_vndk_core_dep(path):
|
||||||
|
d = os.path.dirname(path)
|
||||||
|
return (d == '/system/lib' or d == '/system/lib64' or
|
||||||
|
d == '/system/lib/vndk' or d == '/system/lib64/vndk')
|
||||||
|
|
||||||
|
def add_generic_lib_to_vndk_core(lib):
|
||||||
"""Add a library to vndk-core."""
|
"""Add a library to vndk-core."""
|
||||||
elf = generic_refs.refs[lib.path]
|
elf = generic_refs.refs[lib.path]
|
||||||
|
|
||||||
# Create new vndk-core lib from generic reference.
|
# Create new vndk-core lib from generic reference.
|
||||||
vndk_lib_path = get_vndk_core_lib_name(lib)
|
vndk_lib_path = get_vndk_core_lib_name(lib)
|
||||||
vndk_lib = self.add(PT_SYSTEM, vndk_lib_path, elf)
|
vndk_lib = self.add_lib(PT_SYSTEM, vndk_lib_path, elf)
|
||||||
|
|
||||||
# Resovle the library dependencies.
|
# Resovle the library dependencies.
|
||||||
resolver = self.lib32_resolver if lib.elf.is_32bit else \
|
resolver = vndk_core_resolver32 if lib.elf.is_32bit else \
|
||||||
self.lib64_resolver
|
vndk_core_resolver64
|
||||||
self._resolve_lib_deps(vndk_lib, resolver, generic_refs)
|
self._resolve_lib_deps(vndk_lib, resolver, generic_refs)
|
||||||
|
|
||||||
|
assert all(is_valid_vndk_core_dep(dep.path) for dep in lib.deps)
|
||||||
|
|
||||||
# Add vndk-core to the set.
|
# Add vndk-core to the set.
|
||||||
vndk_core.add(vndk_lib)
|
vndk_core.add(vndk_lib)
|
||||||
|
return vndk_lib
|
||||||
|
|
||||||
# Compute vndk-core, vndk-fwk-ext and vndk-vnd-ext.
|
# Compute vndk-core, vndk-fwk-ext and vndk-vnd-ext.
|
||||||
if not generic_refs:
|
if not generic_refs:
|
||||||
@@ -1112,32 +1203,55 @@ class ELFLinker(object):
|
|||||||
prev_vndk_candidates = vndk_candidates
|
prev_vndk_candidates = vndk_candidates
|
||||||
vndk_candidates = set()
|
vndk_candidates = set()
|
||||||
|
|
||||||
def add_to_vndk_fwk_ext(lib):
|
def replace_linked_lib(user, old_lib, new_lib, dep_type):
|
||||||
|
user.remove_dep(old_lib, dep_type)
|
||||||
|
user.add_dep(new_lib, dep_type)
|
||||||
|
for symbol, imported_lib in user.linked_symbols.items():
|
||||||
|
if imported_lib == old_lib:
|
||||||
|
user.linked_symbols[symbol] = new_lib
|
||||||
|
|
||||||
|
def replace_generic_lib_usages(lib, generic_lib):
|
||||||
|
for user, dep_type in list(lib.users_with_type):
|
||||||
|
if lib not in user.imported_ext_symbols:
|
||||||
|
replace_linked_lib(user, lib, generic_lib, dep_type)
|
||||||
|
|
||||||
|
def add_to_vndk_core(lib):
|
||||||
|
self.rename_lib(lib, PT_SYSTEM, get_vndk_core_lib_name(lib))
|
||||||
|
vndk_core.add(lib)
|
||||||
|
|
||||||
|
def add_to_vndk_fwk_ext(lib, generic_lib):
|
||||||
|
self.rename_lib(lib, PT_SYSTEM,
|
||||||
|
get_vndk_fwk_ext_lib_name(lib))
|
||||||
vndk_fwk_ext.add(lib)
|
vndk_fwk_ext.add(lib)
|
||||||
|
replace_generic_lib_usages(lib, generic_lib)
|
||||||
|
|
||||||
def add_to_vndk_vnd_ext(lib):
|
def add_to_vndk_vnd_ext(lib, generic_lib):
|
||||||
"""Add a library to vndk-vnd-ext."""
|
"""Add a library to vndk-vnd-ext."""
|
||||||
path = lib.path
|
|
||||||
|
|
||||||
# Clone lib object for vndk-vnd-ext.
|
replace_generic_lib_usages(lib, generic_lib)
|
||||||
cloned_lib = self.add(PT_VENDOR, path, lib.elf)
|
|
||||||
|
|
||||||
# Update the usages.
|
# Create a new vndk-vnd-ext library.
|
||||||
for user in list(lib.dt_users):
|
vndk_vnd_ext_lib = self.add_lib(
|
||||||
if user.is_system_lib():
|
PT_VENDOR, get_vndk_vnd_ext_lib_name(lib), lib.elf)
|
||||||
user.remove_dep(lib, ELFLinkData.NEEDED)
|
|
||||||
for user in list(lib.dl_users):
|
|
||||||
if user.is_system_lib():
|
|
||||||
user.remove_dep(lib, ELFLinkData.DLOPEN)
|
|
||||||
|
|
||||||
# Resolve the dependencies.
|
# Vendor libraries should link to vndk_vnd_ext_lib instead.
|
||||||
|
for user, dep_type in list(lib.users_with_type):
|
||||||
|
if not user.is_system_lib():
|
||||||
|
replace_linked_lib(user, lib, vndk_vnd_ext_lib,
|
||||||
|
dep_type)
|
||||||
|
|
||||||
|
# Resolve the dependencies. In order to find more
|
||||||
|
# dependencies from vendor partition to system partition,
|
||||||
|
# continue to resolve dependencies with the global
|
||||||
|
# ELFResolver.
|
||||||
resolver = self.lib32_resolver if lib.elf.is_32bit else \
|
resolver = self.lib32_resolver if lib.elf.is_32bit else \
|
||||||
self.lib64_resolver
|
self.lib64_resolver
|
||||||
self._resolve_lib_deps(cloned_lib, resolver, generic_refs)
|
self._resolve_lib_deps(vndk_vnd_ext_lib, resolver,
|
||||||
|
generic_refs)
|
||||||
|
|
||||||
add_deps_to_vndk_candidate(cloned_lib)
|
add_deps_to_vndk_candidate(vndk_vnd_ext_lib)
|
||||||
|
|
||||||
vndk_vnd_ext.add(cloned_lib)
|
vndk_vnd_ext.add(vndk_vnd_ext_lib)
|
||||||
|
|
||||||
def add_to_vndk_candidate(lib):
|
def add_to_vndk_candidate(lib):
|
||||||
if is_not_vndk(lib):
|
if is_not_vndk(lib):
|
||||||
@@ -1174,15 +1288,11 @@ class ELFLinker(object):
|
|||||||
add_to_vndk_core(lib)
|
add_to_vndk_core(lib)
|
||||||
else:
|
else:
|
||||||
# Outward-customized VNDK libraries.
|
# Outward-customized VNDK libraries.
|
||||||
|
generic_lib = add_generic_lib_to_vndk_core(lib)
|
||||||
# Add a vndk-core counterpart for this lib.
|
|
||||||
add_to_vndk_core(lib)
|
|
||||||
|
|
||||||
# Add this lib to vndk-ext sets.
|
|
||||||
if lib in vndk_customized_for_system:
|
if lib in vndk_customized_for_system:
|
||||||
add_to_vndk_fwk_ext(lib)
|
add_to_vndk_fwk_ext(lib, generic_lib)
|
||||||
if lib in vndk_customized_for_vendor:
|
if lib in vndk_customized_for_vendor:
|
||||||
add_to_vndk_vnd_ext(lib)
|
add_to_vndk_vnd_ext(lib, generic_lib)
|
||||||
|
|
||||||
# Compute VNDK extension candidates.
|
# Compute VNDK extension candidates.
|
||||||
for lib in self._users_po_sorted(vndk_extended_candidates):
|
for lib in self._users_po_sorted(vndk_extended_candidates):
|
||||||
@@ -1198,60 +1308,47 @@ class ELFLinker(object):
|
|||||||
if has_system_users and has_vendor_users:
|
if has_system_users and has_vendor_users:
|
||||||
break
|
break
|
||||||
|
|
||||||
# Add a vndk-core counterpart for this lib.
|
generic_lib = add_generic_lib_to_vndk_core(lib)
|
||||||
add_to_vndk_core(lib)
|
|
||||||
|
|
||||||
# Add this lib to vndk-ext sets.
|
|
||||||
if has_system_users:
|
if has_system_users:
|
||||||
add_to_vndk_fwk_ext(lib)
|
add_to_vndk_fwk_ext(lib, generic_lib)
|
||||||
if has_vendor_users:
|
if has_vendor_users:
|
||||||
add_to_vndk_vnd_ext(lib)
|
add_to_vndk_vnd_ext(lib, generic_lib)
|
||||||
|
|
||||||
# Compute the closure of the VNDK libs.
|
# Compute the closure of the VNDK libs.
|
||||||
vndk_core_paths = set(lib.path for lib in vndk_core)
|
visited_libs = set(vndk_core)
|
||||||
stack = list(vndk_core)
|
processed_paths = set(lib.path for lib in vndk_core)
|
||||||
|
stack = []
|
||||||
|
|
||||||
|
def add_vndk_core_deps_to_stack(lib):
|
||||||
|
for dep in lib.deps:
|
||||||
|
if is_not_vndk(dep):
|
||||||
|
continue
|
||||||
|
if dep not in visited_libs:
|
||||||
|
stack.append(dep)
|
||||||
|
visited_libs.add(dep)
|
||||||
|
|
||||||
|
for lib in vndk_core:
|
||||||
|
add_vndk_core_deps_to_stack(lib)
|
||||||
|
|
||||||
while stack:
|
while stack:
|
||||||
lib = stack.pop()
|
lib = stack.pop()
|
||||||
if is_not_vndk(lib):
|
|
||||||
continue
|
|
||||||
|
|
||||||
stack.extend(lib.deps)
|
|
||||||
|
|
||||||
vndk_lib_path = get_vndk_core_lib_name(lib)
|
vndk_lib_path = get_vndk_core_lib_name(lib)
|
||||||
if vndk_lib_path in vndk_core_paths:
|
if vndk_lib_path in processed_paths:
|
||||||
continue
|
continue
|
||||||
vndk_core_paths.add(vndk_lib_path)
|
|
||||||
|
processed_paths.add(vndk_lib_path)
|
||||||
|
|
||||||
if lib.imported_ext_symbols or \
|
if lib.imported_ext_symbols or \
|
||||||
(generic_refs and not generic_refs.is_equivalent_lib(lib)):
|
(generic_refs and not generic_refs.is_equivalent_lib(lib)):
|
||||||
vndk_fwk_ext.add(lib)
|
generic_lib = add_generic_lib_to_vndk_core(lib)
|
||||||
if generic_refs:
|
add_vndk_core_deps_to_stack(generic_lib)
|
||||||
add_to_vndk_core(lib)
|
add_to_vndk_fwk_ext(lib, generic_lib)
|
||||||
else:
|
else:
|
||||||
vndk_core.add(lib)
|
add_to_vndk_core(lib)
|
||||||
|
add_vndk_core_deps_to_stack(lib)
|
||||||
|
|
||||||
# Truncate all vendor libs and resolve it again.
|
# Truncate all vendor libs and resolve it again.
|
||||||
VENDOR_SEARCH_PATH32 = (
|
|
||||||
'/system/lib/vndk',
|
|
||||||
'/vendor/lib',
|
|
||||||
|
|
||||||
# FIXME: Remove following line after we fixed vndk-stable
|
|
||||||
# resolution.
|
|
||||||
'/system/lib',
|
|
||||||
)
|
|
||||||
|
|
||||||
VENDOR_SEARCH_PATH64 = (
|
|
||||||
'/system/lib64/vndk',
|
|
||||||
'/vendor/lib64',
|
|
||||||
|
|
||||||
# FIXME: Remove following line after we fixed vndk-stable
|
|
||||||
# resolution.
|
|
||||||
'/system/lib64',
|
|
||||||
)
|
|
||||||
|
|
||||||
vendor_resolver32 = ELFResolver(self.lib32, VENDOR_SEARCH_PATH32)
|
|
||||||
vendor_resolver64 = ELFResolver(self.lib64, VENDOR_SEARCH_PATH64)
|
|
||||||
|
|
||||||
for lib in self.lib_pt[PT_VENDOR].values():
|
for lib in self.lib_pt[PT_VENDOR].values():
|
||||||
lib._deps = (set(), set())
|
lib._deps = (set(), set())
|
||||||
lib._users = (set(), set())
|
lib._users = (set(), set())
|
||||||
@@ -1598,7 +1695,8 @@ class VNDKCommand(ELFGraphCommand):
|
|||||||
generic_refs=generic_refs)
|
generic_refs=generic_refs)
|
||||||
|
|
||||||
# Check the API extensions to NDK libraries.
|
# Check the API extensions to NDK libraries.
|
||||||
self._check_ndk_extensions(graph, generic_refs)
|
if generic_refs:
|
||||||
|
self._check_ndk_extensions(graph, generic_refs)
|
||||||
|
|
||||||
# Create banned libraries.
|
# Create banned libraries.
|
||||||
if not args.ban_vendor_lib_dep:
|
if not args.ban_vendor_lib_dep:
|
||||||
@@ -1638,12 +1736,12 @@ class VNDKCommand(ELFGraphCommand):
|
|||||||
|
|
||||||
if args.outward_customization_for_system:
|
if args.outward_customization_for_system:
|
||||||
vndk_customized_for_system.update(
|
vndk_customized_for_system.update(
|
||||||
graph.map_paths_to_libs(
|
graph.get_libs(
|
||||||
args.outward_customization_for_system, lambda x: None))
|
args.outward_customization_for_system, lambda x: None))
|
||||||
|
|
||||||
if args.outward_customization_for_vendor:
|
if args.outward_customization_for_vendor:
|
||||||
vndk_customized_for_vendor.update(
|
vndk_customized_for_vendor.update(
|
||||||
graph.map_paths_to_libs(
|
graph.get_libs(
|
||||||
args.outward_customization_for_vendor, lambda x: None))
|
args.outward_customization_for_vendor, lambda x: None))
|
||||||
|
|
||||||
# Compute vndk heuristics.
|
# Compute vndk heuristics.
|
||||||
@@ -1791,8 +1889,8 @@ class DepsClosureCommand(ELFGraphCommand):
|
|||||||
# Find root/excluded libraries by their paths.
|
# Find root/excluded libraries by their paths.
|
||||||
def report_error(path):
|
def report_error(path):
|
||||||
print('error: no such lib: {}'.format(path), file=sys.stderr)
|
print('error: no such lib: {}'.format(path), file=sys.stderr)
|
||||||
root_libs = graph.map_paths_to_libs(args.lib, report_error)
|
root_libs = graph.get_libs(args.lib, report_error)
|
||||||
excluded_libs = graph.map_paths_to_libs(args.exclude_lib, report_error)
|
excluded_libs = graph.get_libs(args.exclude_lib, report_error)
|
||||||
|
|
||||||
# Compute and print the closure.
|
# Compute and print the closure.
|
||||||
if args.exclude_ndk:
|
if args.exclude_ndk:
|
||||||
|
|||||||
Reference in New Issue
Block a user