vndk-def: Fix inward customization.

Inward-customized VNDK libraries should be renamed instead of cloned.
This commit fixes the algorithm for inward customization and write a
unittest to check the correctness.

Test: ./tests/test_vndk.py
Change-Id: I0d66a93f679be24d7872d6a104497df24f100232
This commit is contained in:
Logan Chien
2017-03-20 19:12:53 +08:00
parent 69aa6de23d
commit 2652037703
34 changed files with 224 additions and 9 deletions

View File

@@ -48,7 +48,7 @@ class ELFLinkerVNDKTest(unittest.TestCase):
def is_banned(self, name):
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)
@@ -80,7 +80,7 @@ class ELFLinkerVNDKTest(unittest.TestCase):
def is_banned(self, name):
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)
@@ -107,6 +107,59 @@ class ELFLinkerVNDKTest(unittest.TestCase):
'/vendor/lib64/vndk-ext/libRS.so'],
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))
if __name__ == '__main__':
unittest.main()

View 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

View 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

View File

@@ -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

View File

@@ -0,0 +1,5 @@
EI_CLASS 32
EI_DATA Little-Endian
E_MACHINE EM_ARM
DT_NEEDED libRS.so
IMP_SYMBOL rsContextCreate

View 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

View File

@@ -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

View File

@@ -0,0 +1,6 @@
EI_CLASS 32
EI_DATA Little-Endian
E_MACHINE EM_ARM
EXP_SYMBOL dlclose
EXP_SYMBOL dlopen
EXP_SYMBOL dlsym

View 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

View File

@@ -0,0 +1,5 @@
EI_CLASS 32
EI_DATA Little-Endian
E_MACHINE EM_ARM
EXP_SYMBOL cos
EXP_SYMBOL sin

View File

@@ -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

View File

@@ -0,0 +1,5 @@
EI_CLASS 64
EI_DATA Little-Endian
E_MACHINE EM_AARCH64
DT_NEEDED libRS.so
IMP_SYMBOL rsContextCreate

View 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

View File

@@ -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

View File

@@ -0,0 +1,6 @@
EI_CLASS 64
EI_DATA Little-Endian
E_MACHINE EM_AARCH64
EXP_SYMBOL dlclose
EXP_SYMBOL dlopen
EXP_SYMBOL dlsym

View 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

View File

@@ -0,0 +1,5 @@
EI_CLASS 64
EI_DATA Little-Endian
E_MACHINE EM_AARCH64
EXP_SYMBOL cos
EXP_SYMBOL sin

View File

@@ -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

View File

@@ -0,0 +1,5 @@
EI_CLASS 32
EI_DATA Little-Endian
E_MACHINE EM_ARM
DT_NEEDED libRS.so
IMP_SYMBOL rsContextCreate

View File

@@ -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

View File

@@ -0,0 +1,5 @@
EI_CLASS 64
EI_DATA Little-Endian
E_MACHINE EM_AARCH64
DT_NEEDED libRS.so
IMP_SYMBOL rsContextCreate

View File

@@ -1210,7 +1210,9 @@ class ELFLinker(object):
for lib in vndk_customized_candidates:
if not lib.imported_ext_symbols:
# Inward-customized VNDK-core libraries.
add_to_vndk_core(lib)
self.rename_lib(lib, PT_SYSTEM,
get_vndk_core_lib_name(lib))
vndk_core.add(lib)
else:
# Outward-customized VNDK libraries.
@@ -1259,15 +1261,19 @@ class ELFLinker(object):
vndk_lib_path = get_vndk_core_lib_name(lib)
if vndk_lib_path in vndk_core_paths:
continue
vndk_core_paths.add(vndk_lib_path)
if lib.imported_ext_symbols or \
(generic_refs and not generic_refs.is_equivalent_lib(lib)):
vndk_fwk_ext.add(lib)
if generic_refs:
add_to_vndk_core(lib)
else:
if not generic_refs:
vndk_core.add(lib)
else:
if lib.imported_ext_symbols or \
not generic_refs.is_equivalent_lib(lib):
vndk_fwk_ext.add(lib)
add_to_vndk_core(lib)
else:
self.rename_lib(lib, PT_SYSTEM, vndk_lib_path)
vndk_core.add(lib)
# Truncate all vendor libs and resolve it again.
VENDOR_SEARCH_PATH32 = (