Merge "Copy sdk-classes.jar to classes-header.jar for turbine."
diff --git a/vndk/tools/definition-tool/tests/test_elf.py b/vndk/tools/definition-tool/tests/test_elf.py
index 0d25370..bb969ed 100755
--- a/vndk/tools/definition-tool/tests/test_elf.py
+++ b/vndk/tools/definition-tool/tests/test_elf.py
@@ -115,6 +115,11 @@
         self.assertEqual('EI_CLASS\t32\n'
                          'EI_DATA\t\tLittle-Endian\n'
                          'E_MACHINE\tEM_AARCH64\n'
+                         'FILE_SIZE\t0\n'
+                         'RO_SEG_FILE_SIZE\t0\n'
+                         'RO_SEG_MEM_SIZE\t0\n'
+                         'RW_SEG_FILE_SIZE\t0\n'
+                         'RW_SEG_MEM_SIZE\t0\n'
                          'DT_RPATH\ta\n'
                          'DT_RUNPATH\tb\n'
                          'DT_NEEDED\tlibc.so\n'
@@ -129,6 +134,11 @@
         data = ('EI_CLASS\t64\n'
                 'EI_DATA\t\tLittle-Endian\n'
                 'E_MACHINE\tEM_AARCH64\n'
+                'FILE_SIZE\t90\n'
+                'RO_SEG_FILE_SIZE\t18\n'
+                'RO_SEG_MEM_SIZE\t24\n'
+                'RW_SEG_FILE_SIZE\t42\n'
+                'RW_SEG_MEM_SIZE\t81\n'
                 'DT_RPATH\trpath_1\n'
                 'DT_RPATH\trpath_2\n'
                 'DT_RUNPATH\trunpath_1\n'
@@ -144,6 +154,11 @@
             self.assertEqual(ELF.ELFCLASS64, res.ei_class)
             self.assertEqual(ELF.ELFDATA2LSB, res.ei_data)
             self.assertEqual(183, res.e_machine)
+            self.assertEqual(90, res.file_size)
+            self.assertEqual(18, res.ro_seg_file_size)
+            self.assertEqual(24, res.ro_seg_mem_size)
+            self.assertEqual(42, res.rw_seg_file_size)
+            self.assertEqual(81, res.rw_seg_mem_size)
             self.assertEqual(['rpath_1', 'rpath_2'], res.dt_rpath)
             self.assertEqual(['runpath_1', 'runpath_2'], res.dt_runpath)
             self.assertEqual(['libc.so', 'libm.so'], res.dt_needed)
diff --git a/vndk/tools/definition-tool/tests/test_elfdump.py b/vndk/tools/definition-tool/tests/test_elfdump.py
index b8e3c1e..2c0b230 100755
--- a/vndk/tools/definition-tool/tests/test_elfdump.py
+++ b/vndk/tools/definition-tool/tests/test_elfdump.py
@@ -6,6 +6,7 @@
 import collections
 import difflib
 import os
+import re
 import subprocess
 import sys
 import unittest
@@ -96,12 +97,25 @@
                     ['-shared', '-lc', '-Wl,-rpath,/system/lib:/vendor/lib',
                      '-Wl,--enable-new-dtags'])
 
+    def _remove_size_lines(self, lines):
+        """Remove file size information because they may vary."""
+        prefixes = (
+            'FILE_SIZE\t',
+            'RO_SEG_FILE_SIZE\t',
+            'RO_SEG_MEM_SIZE\t',
+            'RW_SEG_FILE_SIZE\t',
+            'RW_SEG_MEM_SIZE\t',
+        )
+        patt = re.compile('|'.join('(?:' + re.escape(x) +')' for x in prefixes))
+        return [line for line in lines if not patt.match(line)]
+
     def _assert_equal_to_file(self, expected_file_name, actual):
         actual = actual.splitlines(True)
         expected_file_path = os.path.join(self.expected_dir, expected_file_name)
         with open(expected_file_path, 'r') as f:
             expected = f.readlines()
-        self.assertEqual(expected, actual)
+        self.assertEqual(self._remove_size_lines(expected),
+                         self._remove_size_lines(actual))
 
     def _test_main_out(self):
         out_file = os.path.join(self.test_dir, 'main.out')
diff --git a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm/libtest-rpath-multi.so.txt b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm/libtest-rpath-multi.so.txt
index 59db4c5..e2a2e3a 100644
--- a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm/libtest-rpath-multi.so.txt
+++ b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm/libtest-rpath-multi.so.txt
@@ -1,6 +1,11 @@
 EI_CLASS	32
 EI_DATA		Little-Endian
 E_MACHINE	EM_ARM
+FILE_SIZE	6220
+RO_SEG_FILE_SIZE	880
+RO_SEG_MEM_SIZE	880
+RW_SEG_FILE_SIZE	280
+RW_SEG_MEM_SIZE	280
 DT_RPATH	/system/lib
 DT_RPATH	/vendor/lib
 DT_NEEDED	libc.so
diff --git a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm/libtest-rpath.so.txt b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm/libtest-rpath.so.txt
index 1c19446..91e2664 100644
--- a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm/libtest-rpath.so.txt
+++ b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm/libtest-rpath.so.txt
@@ -1,6 +1,11 @@
 EI_CLASS	32
 EI_DATA		Little-Endian
 E_MACHINE	EM_ARM
+FILE_SIZE	6220
+RO_SEG_FILE_SIZE	864
+RO_SEG_MEM_SIZE	864
+RW_SEG_FILE_SIZE	280
+RW_SEG_MEM_SIZE	280
 DT_RPATH	$ORIGIN/../lib
 DT_NEEDED	libc.so
 EXP_SYMBOL	__bss_start
diff --git a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm/libtest-runpath-multi.so.txt b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm/libtest-runpath-multi.so.txt
index 0d42f82..17b8905 100644
--- a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm/libtest-runpath-multi.so.txt
+++ b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm/libtest-runpath-multi.so.txt
@@ -1,6 +1,11 @@
 EI_CLASS	32
 EI_DATA		Little-Endian
 E_MACHINE	EM_ARM
+FILE_SIZE	6220
+RO_SEG_FILE_SIZE	880
+RO_SEG_MEM_SIZE	880
+RW_SEG_FILE_SIZE	280
+RW_SEG_MEM_SIZE	280
 DT_RUNPATH	/system/lib
 DT_RUNPATH	/vendor/lib
 DT_NEEDED	libc.so
diff --git a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm/libtest-runpath.so.txt b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm/libtest-runpath.so.txt
index ab70935..9063ffe 100644
--- a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm/libtest-runpath.so.txt
+++ b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm/libtest-runpath.so.txt
@@ -1,6 +1,11 @@
 EI_CLASS	32
 EI_DATA		Little-Endian
 E_MACHINE	EM_ARM
+FILE_SIZE	6220
+RO_SEG_FILE_SIZE	864
+RO_SEG_MEM_SIZE	864
+RW_SEG_FILE_SIZE	280
+RW_SEG_MEM_SIZE	280
 DT_RUNPATH	$ORIGIN/../lib
 DT_NEEDED	libc.so
 EXP_SYMBOL	__bss_start
diff --git a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm/libtest.so.txt b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm/libtest.so.txt
index 54f89ae..474a117 100644
--- a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm/libtest.so.txt
+++ b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm/libtest.so.txt
@@ -1,6 +1,11 @@
 EI_CLASS	32
 EI_DATA		Little-Endian
 E_MACHINE	EM_ARM
+FILE_SIZE	6220
+RO_SEG_FILE_SIZE	844
+RO_SEG_MEM_SIZE	844
+RW_SEG_FILE_SIZE	272
+RW_SEG_MEM_SIZE	272
 DT_NEEDED	libc.so
 EXP_SYMBOL	__bss_start
 EXP_SYMBOL	_edata
diff --git a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm/main.out.txt b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm/main.out.txt
index 7f5dbac..c00f692 100644
--- a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm/main.out.txt
+++ b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm/main.out.txt
@@ -1,6 +1,11 @@
 EI_CLASS	32
 EI_DATA		Little-Endian
 E_MACHINE	EM_ARM
+FILE_SIZE	6776
+RO_SEG_FILE_SIZE	1646
+RO_SEG_MEM_SIZE	1646
+RW_SEG_FILE_SIZE	344
+RW_SEG_MEM_SIZE	348
 DT_NEEDED	libdl.so
 DT_NEEDED	libc.so
 DT_NEEDED	libstdc++.so
diff --git a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm64/libtest-rpath-multi.so.txt b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm64/libtest-rpath-multi.so.txt
index 2cece74..ba3832f 100644
--- a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm64/libtest-rpath-multi.so.txt
+++ b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm64/libtest-rpath-multi.so.txt
@@ -1,6 +1,11 @@
 EI_CLASS	64
 EI_DATA		Little-Endian
 E_MACHINE	EM_AARCH64
+FILE_SIZE	7296
+RO_SEG_FILE_SIZE	1248
+RO_SEG_MEM_SIZE	1248
+RW_SEG_FILE_SIZE	520
+RW_SEG_MEM_SIZE	520
 DT_RPATH	/system/lib
 DT_RPATH	/vendor/lib
 DT_NEEDED	libc.so
diff --git a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm64/libtest-rpath.so.txt b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm64/libtest-rpath.so.txt
index 028080e..07265eb 100644
--- a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm64/libtest-rpath.so.txt
+++ b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm64/libtest-rpath.so.txt
@@ -1,6 +1,11 @@
 EI_CLASS	64
 EI_DATA		Little-Endian
 E_MACHINE	EM_AARCH64
+FILE_SIZE	7296
+RO_SEG_FILE_SIZE	1248
+RO_SEG_MEM_SIZE	1248
+RW_SEG_FILE_SIZE	520
+RW_SEG_MEM_SIZE	520
 DT_RPATH	$ORIGIN/../lib
 DT_NEEDED	libc.so
 EXP_SYMBOL	__bss_end__
diff --git a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm64/libtest-runpath-multi.so.txt b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm64/libtest-runpath-multi.so.txt
index 2d97f6d..090280b 100644
--- a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm64/libtest-runpath-multi.so.txt
+++ b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm64/libtest-runpath-multi.so.txt
@@ -1,6 +1,11 @@
 EI_CLASS	64
 EI_DATA		Little-Endian
 E_MACHINE	EM_AARCH64
+FILE_SIZE	7296
+RO_SEG_FILE_SIZE	1248
+RO_SEG_MEM_SIZE	1248
+RW_SEG_FILE_SIZE	520
+RW_SEG_MEM_SIZE	520
 DT_RUNPATH	/system/lib
 DT_RUNPATH	/vendor/lib
 DT_NEEDED	libc.so
diff --git a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm64/libtest-runpath.so.txt b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm64/libtest-runpath.so.txt
index eb88f22..ba19600 100644
--- a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm64/libtest-runpath.so.txt
+++ b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm64/libtest-runpath.so.txt
@@ -1,6 +1,11 @@
 EI_CLASS	64
 EI_DATA		Little-Endian
 E_MACHINE	EM_AARCH64
+FILE_SIZE	7296
+RO_SEG_FILE_SIZE	1248
+RO_SEG_MEM_SIZE	1248
+RW_SEG_FILE_SIZE	520
+RW_SEG_MEM_SIZE	520
 DT_RUNPATH	$ORIGIN/../lib
 DT_NEEDED	libc.so
 EXP_SYMBOL	__bss_end__
diff --git a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm64/libtest.so.txt b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm64/libtest.so.txt
index 4b2bac6..080aa09 100644
--- a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm64/libtest.so.txt
+++ b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm64/libtest.so.txt
@@ -1,6 +1,11 @@
 EI_CLASS	64
 EI_DATA		Little-Endian
 E_MACHINE	EM_AARCH64
+FILE_SIZE	7296
+RO_SEG_FILE_SIZE	1232
+RO_SEG_MEM_SIZE	1232
+RW_SEG_FILE_SIZE	504
+RW_SEG_MEM_SIZE	504
 DT_NEEDED	libc.so
 EXP_SYMBOL	__bss_end__
 EXP_SYMBOL	__bss_start
diff --git a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm64/main.out.txt b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm64/main.out.txt
index c1750e3..7cd39f8 100644
--- a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm64/main.out.txt
+++ b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/arm64/main.out.txt
@@ -1,6 +1,11 @@
 EI_CLASS	64
 EI_DATA		Little-Endian
 E_MACHINE	EM_AARCH64
+FILE_SIZE	8256
+RO_SEG_FILE_SIZE	2410
+RO_SEG_MEM_SIZE	2410
+RW_SEG_FILE_SIZE	664
+RW_SEG_MEM_SIZE	664
 DT_NEEDED	libdl.so
 DT_NEEDED	libc.so
 DT_NEEDED	libstdc++.so
diff --git a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips/libtest-rpath-multi.so.txt b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips/libtest-rpath-multi.so.txt
index e560cc9..3a5ab9a 100644
--- a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips/libtest-rpath-multi.so.txt
+++ b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips/libtest-rpath-multi.so.txt
@@ -1,6 +1,11 @@
 EI_CLASS	32
 EI_DATA		Little-Endian
 E_MACHINE	EM_MIPS
+FILE_SIZE	6660
+RO_SEG_FILE_SIZE	1180
+RO_SEG_MEM_SIZE	1180
+RW_SEG_FILE_SIZE	308
+RW_SEG_MEM_SIZE	308
 DT_RPATH	/system/lib
 DT_RPATH	/vendor/lib
 DT_NEEDED	libc.so
diff --git a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips/libtest-rpath.so.txt b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips/libtest-rpath.so.txt
index 45a48aa..7e16d5f 100644
--- a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips/libtest-rpath.so.txt
+++ b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips/libtest-rpath.so.txt
@@ -1,6 +1,11 @@
 EI_CLASS	32
 EI_DATA		Little-Endian
 E_MACHINE	EM_MIPS
+FILE_SIZE	6660
+RO_SEG_FILE_SIZE	1164
+RO_SEG_MEM_SIZE	1164
+RW_SEG_FILE_SIZE	308
+RW_SEG_MEM_SIZE	308
 DT_RPATH	$ORIGIN/../lib
 DT_NEEDED	libc.so
 EXP_SYMBOL	__bss_end__
diff --git a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips/libtest-runpath-multi.so.txt b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips/libtest-runpath-multi.so.txt
index 51b821b..a3afbde 100644
--- a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips/libtest-runpath-multi.so.txt
+++ b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips/libtest-runpath-multi.so.txt
@@ -1,6 +1,11 @@
 EI_CLASS	32
 EI_DATA		Little-Endian
 E_MACHINE	EM_MIPS
+FILE_SIZE	6660
+RO_SEG_FILE_SIZE	1180
+RO_SEG_MEM_SIZE	1180
+RW_SEG_FILE_SIZE	308
+RW_SEG_MEM_SIZE	308
 DT_RUNPATH	/system/lib
 DT_RUNPATH	/vendor/lib
 DT_NEEDED	libc.so
diff --git a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips/libtest-runpath.so.txt b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips/libtest-runpath.so.txt
index 0400e61..9bfb835 100644
--- a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips/libtest-runpath.so.txt
+++ b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips/libtest-runpath.so.txt
@@ -1,6 +1,11 @@
 EI_CLASS	32
 EI_DATA		Little-Endian
 E_MACHINE	EM_MIPS
+FILE_SIZE	6660
+RO_SEG_FILE_SIZE	1164
+RO_SEG_MEM_SIZE	1164
+RW_SEG_FILE_SIZE	308
+RW_SEG_MEM_SIZE	308
 DT_RUNPATH	$ORIGIN/../lib
 DT_NEEDED	libc.so
 EXP_SYMBOL	__bss_end__
diff --git a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips/libtest.so.txt b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips/libtest.so.txt
index ff112d5..3266488 100644
--- a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips/libtest.so.txt
+++ b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips/libtest.so.txt
@@ -1,6 +1,11 @@
 EI_CLASS	32
 EI_DATA		Little-Endian
 E_MACHINE	EM_MIPS
+FILE_SIZE	6660
+RO_SEG_FILE_SIZE	1164
+RO_SEG_MEM_SIZE	1164
+RW_SEG_FILE_SIZE	300
+RW_SEG_MEM_SIZE	300
 DT_NEEDED	libc.so
 EXP_SYMBOL	__bss_end__
 EXP_SYMBOL	__bss_start
diff --git a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips/main.out.txt b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips/main.out.txt
index 5a81d93..716a8eb 100644
--- a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips/main.out.txt
+++ b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips/main.out.txt
@@ -1,6 +1,11 @@
 EI_CLASS	32
 EI_DATA		Little-Endian
 E_MACHINE	EM_MIPS
+FILE_SIZE	7936
+RO_SEG_FILE_SIZE	2384
+RO_SEG_MEM_SIZE	2384
+RW_SEG_FILE_SIZE	396
+RW_SEG_MEM_SIZE	416
 DT_NEEDED	libdl.so
 DT_NEEDED	libc.so
 DT_NEEDED	libstdc++.so
diff --git a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips64/libtest-rpath-multi.so.txt b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips64/libtest-rpath-multi.so.txt
index cb3216e..b29f77f 100644
--- a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips64/libtest-rpath-multi.so.txt
+++ b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips64/libtest-rpath-multi.so.txt
@@ -1,6 +1,11 @@
 EI_CLASS	64
 EI_DATA		Little-Endian
 E_MACHINE	EM_MIPS
+FILE_SIZE	7640
+RO_SEG_FILE_SIZE	2092
+RO_SEG_MEM_SIZE	2092
+RW_SEG_FILE_SIZE	104
+RW_SEG_MEM_SIZE	104
 DT_RPATH	/system/lib
 DT_RPATH	/vendor/lib
 DT_NEEDED	libc.so
diff --git a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips64/libtest-rpath.so.txt b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips64/libtest-rpath.so.txt
index 6cc3272..c4d1cc6 100644
--- a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips64/libtest-rpath.so.txt
+++ b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips64/libtest-rpath.so.txt
@@ -1,6 +1,11 @@
 EI_CLASS	64
 EI_DATA		Little-Endian
 E_MACHINE	EM_MIPS
+FILE_SIZE	7640
+RO_SEG_FILE_SIZE	2092
+RO_SEG_MEM_SIZE	2092
+RW_SEG_FILE_SIZE	104
+RW_SEG_MEM_SIZE	104
 DT_RPATH	$ORIGIN/../lib
 DT_NEEDED	libc.so
 EXP_SYMBOL	__bss_end__
diff --git a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips64/libtest-runpath-multi.so.txt b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips64/libtest-runpath-multi.so.txt
index 86578ac..60342cc 100644
--- a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips64/libtest-runpath-multi.so.txt
+++ b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips64/libtest-runpath-multi.so.txt
@@ -1,6 +1,11 @@
 EI_CLASS	64
 EI_DATA		Little-Endian
 E_MACHINE	EM_MIPS
+FILE_SIZE	7640
+RO_SEG_FILE_SIZE	2092
+RO_SEG_MEM_SIZE	2092
+RW_SEG_FILE_SIZE	104
+RW_SEG_MEM_SIZE	104
 DT_RUNPATH	/system/lib
 DT_RUNPATH	/vendor/lib
 DT_NEEDED	libc.so
diff --git a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips64/libtest-runpath.so.txt b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips64/libtest-runpath.so.txt
index be2b32b..b115068 100644
--- a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips64/libtest-runpath.so.txt
+++ b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips64/libtest-runpath.so.txt
@@ -1,6 +1,11 @@
 EI_CLASS	64
 EI_DATA		Little-Endian
 E_MACHINE	EM_MIPS
+FILE_SIZE	7640
+RO_SEG_FILE_SIZE	2092
+RO_SEG_MEM_SIZE	2092
+RW_SEG_FILE_SIZE	104
+RW_SEG_MEM_SIZE	104
 DT_RUNPATH	$ORIGIN/../lib
 DT_NEEDED	libc.so
 EXP_SYMBOL	__bss_end__
diff --git a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips64/libtest.so.txt b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips64/libtest.so.txt
index fe0f6bb..4f72c60 100644
--- a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips64/libtest.so.txt
+++ b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips64/libtest.so.txt
@@ -1,6 +1,11 @@
 EI_CLASS	64
 EI_DATA		Little-Endian
 E_MACHINE	EM_MIPS
+FILE_SIZE	7640
+RO_SEG_FILE_SIZE	2060
+RO_SEG_MEM_SIZE	2060
+RW_SEG_FILE_SIZE	104
+RW_SEG_MEM_SIZE	104
 DT_NEEDED	libc.so
 EXP_SYMBOL	__bss_end__
 EXP_SYMBOL	__bss_start
diff --git a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips64/main.out.txt b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips64/main.out.txt
index 441a815..47cc08b 100644
--- a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips64/main.out.txt
+++ b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/mips64/main.out.txt
@@ -1,6 +1,11 @@
 EI_CLASS	64
 EI_DATA		Little-Endian
 E_MACHINE	EM_MIPS
+FILE_SIZE	9568
+RO_SEG_FILE_SIZE	3448
+RO_SEG_MEM_SIZE	3448
+RW_SEG_FILE_SIZE	216
+RW_SEG_MEM_SIZE	240
 DT_NEEDED	libdl.so
 DT_NEEDED	libc.so
 DT_NEEDED	libstdc++.so
diff --git a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86/libtest-rpath-multi.so.txt b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86/libtest-rpath-multi.so.txt
index 73b0e89..540a228 100644
--- a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86/libtest-rpath-multi.so.txt
+++ b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86/libtest-rpath-multi.so.txt
@@ -1,6 +1,11 @@
 EI_CLASS	32
 EI_DATA		Little-Endian
 E_MACHINE	EM_386
+FILE_SIZE	6212
+RO_SEG_FILE_SIZE	1364
+RO_SEG_MEM_SIZE	1364
+RW_SEG_FILE_SIZE	284
+RW_SEG_MEM_SIZE	284
 DT_RPATH	/system/lib
 DT_RPATH	/vendor/lib
 DT_NEEDED	libc.so
diff --git a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86/libtest-rpath.so.txt b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86/libtest-rpath.so.txt
index f974860..06b6bb6 100644
--- a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86/libtest-rpath.so.txt
+++ b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86/libtest-rpath.so.txt
@@ -1,6 +1,11 @@
 EI_CLASS	32
 EI_DATA		Little-Endian
 E_MACHINE	EM_386
+FILE_SIZE	6212
+RO_SEG_FILE_SIZE	1348
+RO_SEG_MEM_SIZE	1348
+RW_SEG_FILE_SIZE	284
+RW_SEG_MEM_SIZE	284
 DT_RPATH	$ORIGIN/../lib
 DT_NEEDED	libc.so
 EXP_SYMBOL	__bss_start
diff --git a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86/libtest-runpath-multi.so.txt b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86/libtest-runpath-multi.so.txt
index 301c13d..c285100 100644
--- a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86/libtest-runpath-multi.so.txt
+++ b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86/libtest-runpath-multi.so.txt
@@ -1,6 +1,11 @@
 EI_CLASS	32
 EI_DATA		Little-Endian
 E_MACHINE	EM_386
+FILE_SIZE	6212
+RO_SEG_FILE_SIZE	1364
+RO_SEG_MEM_SIZE	1364
+RW_SEG_FILE_SIZE	284
+RW_SEG_MEM_SIZE	284
 DT_RUNPATH	/system/lib
 DT_RUNPATH	/vendor/lib
 DT_NEEDED	libc.so
diff --git a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86/libtest-runpath.so.txt b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86/libtest-runpath.so.txt
index 944a98c..560e823 100644
--- a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86/libtest-runpath.so.txt
+++ b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86/libtest-runpath.so.txt
@@ -1,6 +1,11 @@
 EI_CLASS	32
 EI_DATA		Little-Endian
 E_MACHINE	EM_386
+FILE_SIZE	6212
+RO_SEG_FILE_SIZE	1348
+RO_SEG_MEM_SIZE	1348
+RW_SEG_FILE_SIZE	284
+RW_SEG_MEM_SIZE	284
 DT_RUNPATH	$ORIGIN/../lib
 DT_NEEDED	libc.so
 EXP_SYMBOL	__bss_start
diff --git a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86/libtest.so.txt b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86/libtest.so.txt
index 992f48b..7df95ed 100644
--- a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86/libtest.so.txt
+++ b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86/libtest.so.txt
@@ -1,6 +1,11 @@
 EI_CLASS	32
 EI_DATA		Little-Endian
 E_MACHINE	EM_386
+FILE_SIZE	6212
+RO_SEG_FILE_SIZE	1316
+RO_SEG_MEM_SIZE	1316
+RW_SEG_FILE_SIZE	276
+RW_SEG_MEM_SIZE	276
 DT_NEEDED	libc.so
 EXP_SYMBOL	__bss_start
 EXP_SYMBOL	_edata
diff --git a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86/main.out.txt b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86/main.out.txt
index ec0edb9..4801fdd 100644
--- a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86/main.out.txt
+++ b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86/main.out.txt
@@ -1,6 +1,11 @@
 EI_CLASS	32
 EI_DATA		Little-Endian
 E_MACHINE	EM_386
+FILE_SIZE	6680
+RO_SEG_FILE_SIZE	1992
+RO_SEG_MEM_SIZE	1992
+RW_SEG_FILE_SIZE	288
+RW_SEG_MEM_SIZE	292
 DT_NEEDED	libdl.so
 DT_NEEDED	libc.so
 DT_NEEDED	libstdc++.so
diff --git a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86_64/libtest-rpath-multi.so.txt b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86_64/libtest-rpath-multi.so.txt
index efa204f..da530ff 100644
--- a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86_64/libtest-rpath-multi.so.txt
+++ b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86_64/libtest-rpath-multi.so.txt
@@ -1,6 +1,11 @@
 EI_CLASS	64
 EI_DATA		Little-Endian
 E_MACHINE	EM_X86_64
+FILE_SIZE	6888
+RO_SEG_FILE_SIZE	1456
+RO_SEG_MEM_SIZE	1456
+RW_SEG_FILE_SIZE	560
+RW_SEG_MEM_SIZE	560
 DT_RPATH	/system/lib
 DT_RPATH	/vendor/lib
 DT_NEEDED	libc.so
diff --git a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86_64/libtest-rpath.so.txt b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86_64/libtest-rpath.so.txt
index 5fc5b01..34d9865 100644
--- a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86_64/libtest-rpath.so.txt
+++ b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86_64/libtest-rpath.so.txt
@@ -1,6 +1,11 @@
 EI_CLASS	64
 EI_DATA		Little-Endian
 E_MACHINE	EM_X86_64
+FILE_SIZE	6888
+RO_SEG_FILE_SIZE	1440
+RO_SEG_MEM_SIZE	1440
+RW_SEG_FILE_SIZE	560
+RW_SEG_MEM_SIZE	560
 DT_RPATH	$ORIGIN/../lib
 DT_NEEDED	libc.so
 EXP_SYMBOL	__bss_start
diff --git a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86_64/libtest-runpath-multi.so.txt b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86_64/libtest-runpath-multi.so.txt
index bad50ed..8f12078 100644
--- a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86_64/libtest-runpath-multi.so.txt
+++ b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86_64/libtest-runpath-multi.so.txt
@@ -1,6 +1,11 @@
 EI_CLASS	64
 EI_DATA		Little-Endian
 E_MACHINE	EM_X86_64
+FILE_SIZE	6888
+RO_SEG_FILE_SIZE	1456
+RO_SEG_MEM_SIZE	1456
+RW_SEG_FILE_SIZE	560
+RW_SEG_MEM_SIZE	560
 DT_RUNPATH	/system/lib
 DT_RUNPATH	/vendor/lib
 DT_NEEDED	libc.so
diff --git a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86_64/libtest-runpath.so.txt b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86_64/libtest-runpath.so.txt
index adf06b4..47bc2ff 100644
--- a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86_64/libtest-runpath.so.txt
+++ b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86_64/libtest-runpath.so.txt
@@ -1,6 +1,11 @@
 EI_CLASS	64
 EI_DATA		Little-Endian
 E_MACHINE	EM_X86_64
+FILE_SIZE	6888
+RO_SEG_FILE_SIZE	1440
+RO_SEG_MEM_SIZE	1440
+RW_SEG_FILE_SIZE	560
+RW_SEG_MEM_SIZE	560
 DT_RUNPATH	$ORIGIN/../lib
 DT_NEEDED	libc.so
 EXP_SYMBOL	__bss_start
diff --git a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86_64/libtest.so.txt b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86_64/libtest.so.txt
index c9f14fe..e7a2aaa 100644
--- a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86_64/libtest.so.txt
+++ b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86_64/libtest.so.txt
@@ -1,6 +1,11 @@
 EI_CLASS	64
 EI_DATA		Little-Endian
 E_MACHINE	EM_X86_64
+FILE_SIZE	6888
+RO_SEG_FILE_SIZE	1424
+RO_SEG_MEM_SIZE	1424
+RW_SEG_FILE_SIZE	544
+RW_SEG_MEM_SIZE	544
 DT_NEEDED	libc.so
 EXP_SYMBOL	__bss_start
 EXP_SYMBOL	_edata
diff --git a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86_64/main.out.txt b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86_64/main.out.txt
index 3a63951..a1c9466 100644
--- a/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86_64/main.out.txt
+++ b/vndk/tools/definition-tool/tests/testdata/test_elfdump/expected/x86_64/main.out.txt
@@ -1,6 +1,11 @@
 EI_CLASS	64
 EI_DATA		Little-Endian
 E_MACHINE	EM_X86_64
+FILE_SIZE	7584
+RO_SEG_FILE_SIZE	2248
+RO_SEG_MEM_SIZE	2248
+RW_SEG_FILE_SIZE	664
+RW_SEG_MEM_SIZE	672
 DT_NEEDED	libdl.so
 DT_NEEDED	libc.so
 DT_NEEDED	libstdc++.so
diff --git a/vndk/tools/definition-tool/vndk_definition_tool.py b/vndk/tools/definition-tool/vndk_definition_tool.py
index 73cb7f2..6887c75 100755
--- a/vndk/tools/definition-tool/vndk_definition_tool.py
+++ b/vndk/tools/definition-tool/vndk_definition_tool.py
@@ -121,6 +121,11 @@
         'sh_addralign sh_entsize')
 
 
+Elf_Phdr = collections.namedtuple(
+        'Elf_Phdr',
+        'p_type p_offset p_vaddr p_paddr p_filesz p_memsz p_flags p_align')
+
+
 Elf_Dyn = collections.namedtuple('Elf_Dyn', 'd_tag d_val')
 
 
@@ -173,6 +178,12 @@
     ELFDATA2LSB = 1
     ELFDATA2MSB = 2
 
+    PT_LOAD = 1
+
+    PF_X = 1
+    PF_W = 2
+    PF_R = 4
+
     DT_NEEDED = 1
     DT_RPATH = 15
     DT_RUNPATH = 29
@@ -227,12 +238,16 @@
 
 
     __slots__ = ('ei_class', 'ei_data', 'e_machine', 'dt_rpath', 'dt_runpath',
-                 'dt_needed', 'exported_symbols', 'imported_symbols',)
+                 'dt_needed', 'exported_symbols', 'imported_symbols',
+                 'file_size', 'ro_seg_file_size', 'ro_seg_mem_size',
+                 'rw_seg_file_size', 'rw_seg_mem_size',)
 
 
     def __init__(self, ei_class=ELFCLASSNONE, ei_data=ELFDATANONE, e_machine=0,
                  dt_rpath=None, dt_runpath=None, dt_needed=None,
-                 exported_symbols=None, imported_symbols=None):
+                 exported_symbols=None, imported_symbols=None,
+                 file_size=0, ro_seg_file_size=0, ro_seg_mem_size=0,
+                 rw_seg_file_size=0, rw_seg_mem_size=0):
         self.ei_class = ei_class
         self.ei_data = ei_data
         self.e_machine = e_machine
@@ -243,6 +258,11 @@
                 exported_symbols if exported_symbols is not None else set()
         self.imported_symbols = \
                 imported_symbols if imported_symbols is not None else set()
+        self.file_size = file_size
+        self.ro_seg_file_size = ro_seg_file_size
+        self.ro_seg_mem_size = ro_seg_mem_size
+        self.rw_seg_file_size = rw_seg_file_size
+        self.rw_seg_mem_size = rw_seg_mem_size
 
     def __repr__(self):
         args = (a + '=' + repr(getattr(self, a)) for a in self.__slots__)
@@ -286,6 +306,11 @@
         print('EI_CLASS\t' + self.elf_class_name, file=file)
         print('EI_DATA\t\t' + self.elf_data_name, file=file)
         print('E_MACHINE\t' + self.elf_machine_name, file=file)
+        print('FILE_SIZE\t' + str(self.file_size), file=file)
+        print('RO_SEG_FILE_SIZE\t' + str(self.ro_seg_file_size), file=file)
+        print('RO_SEG_MEM_SIZE\t' + str(self.ro_seg_mem_size), file=file)
+        print('RW_SEG_FILE_SIZE\t' + str(self.rw_seg_file_size), file=file)
+        print('RW_SEG_MEM_SIZE\t' + str(self.rw_seg_mem_size), file=file)
         for dt_rpath in self.dt_rpath:
             print('DT_RPATH\t' + dt_rpath, file=file)
         for dt_runpath in self.dt_runpath:
@@ -334,17 +359,21 @@
         if self.ei_data not in (ELF.ELFDATA2LSB, ELF.ELFDATA2MSB):
             raise ELFError('unknown endianness')
 
+        self.file_size = buf.size()
+
         # ELF structure definitions.
         endian_fmt = '<' if self.ei_data == ELF.ELFDATA2LSB else '>'
 
         if self.is_32bit:
             elf_hdr_fmt = endian_fmt + '4x4B8xHHLLLLLHHHHHH'
             elf_shdr_fmt = endian_fmt + 'LLLLLLLLLL'
+            elf_phdr_fmt = endian_fmt + 'LLLLLLLL'
             elf_dyn_fmt = endian_fmt + 'lL'
             elf_sym_fmt = endian_fmt + 'LLLBBH'
         else:
             elf_hdr_fmt = endian_fmt + '4x4B8xHHLQQQLHHHHHH'
             elf_shdr_fmt = endian_fmt + 'LLQQQQLLQQ'
+            elf_phdr_fmt = endian_fmt + 'LLQQQQQQ'
             elf_dyn_fmt = endian_fmt + 'QQ'
             elf_sym_fmt = endian_fmt + 'LBBHQQ'
 
@@ -361,6 +390,19 @@
             return parse_struct(Elf_Shdr, elf_shdr_fmt, offset,
                                 'bad section header')
 
+        if self.is_32bit:
+            def parse_elf_phdr(offset):
+                return parse_struct(Elf_Phdr, elf_phdr_fmt, offset,
+                                    'bad program header')
+        else:
+            def parse_elf_phdr(offset):
+                try:
+                    p = struct.unpack_from(elf_phdr_fmt, buf, offset)
+                    return Elf_Phdr(p[0], p[2], p[3], p[4], p[5], p[6], p[1],
+                                    p[7])
+                except struct.error:
+                    raise ELFError('bad program header')
+
         def parse_elf_dyn(offset):
             return parse_struct(Elf_Dyn, elf_dyn_fmt, offset,
                                 'bad .dynamic entry')
@@ -383,6 +425,33 @@
         header = parse_elf_hdr(0)
         self.e_machine = header.e_machine
 
+        # Parse ELF program header and calculate segment size.
+        if header.e_phentsize == 0:
+            raise ELFError('no program header')
+
+        ro_seg_file_size = 0
+        ro_seg_mem_size = 0
+        rw_seg_file_size = 0
+        rw_seg_mem_size = 0
+
+        assert struct.calcsize(elf_phdr_fmt) == header.e_phentsize
+        seg_end = header.e_phoff + header.e_phnum * header.e_phentsize
+        for phdr_off in range(header.e_phoff, seg_end, header.e_phentsize):
+            phdr = parse_elf_phdr(phdr_off)
+            if phdr.p_type != ELF.PT_LOAD:
+                continue
+            if phdr.p_flags & ELF.PF_W:
+                rw_seg_file_size += phdr.p_filesz
+                rw_seg_mem_size += phdr.p_memsz
+            else:
+                ro_seg_file_size += phdr.p_filesz
+                ro_seg_mem_size += phdr.p_memsz
+
+        self.ro_seg_file_size = ro_seg_file_size
+        self.ro_seg_mem_size = ro_seg_mem_size
+        self.rw_seg_file_size = rw_seg_file_size
+        self.rw_seg_mem_size = rw_seg_mem_size
+
         # Check section header size.
         if header.e_shentsize == 0:
             raise ELFError('no section header')
@@ -481,6 +550,16 @@
                 self.ei_data = ELF.get_ei_data_from_name(value)
             elif key == 'E_MACHINE':
                 self.e_machine = ELF.get_e_machine_from_name(value)
+            elif key == 'FILE_SIZE':
+                self.file_size = int(value)
+            elif key == 'RO_SEG_FILE_SIZE':
+                self.ro_seg_file_size = int(value)
+            elif key == 'RO_SEG_MEM_SIZE':
+                self.ro_seg_mem_size = int(value)
+            elif key == 'RW_SEG_FILE_SIZE':
+                self.rw_seg_file_size = int(value)
+            elif key == 'RW_SEG_MEM_SIZE':
+                self.rw_seg_mem_size = int(value)
             elif key == 'DT_RPATH':
                 self.dt_rpath.append(intern(value))
             elif key == 'DT_RUNPATH':
@@ -2056,6 +2135,10 @@
                 '--output-format', default='tag',
                 help='output format for vndk classification')
 
+        parser.add_argument(
+                '--file-size-output',
+                help='output file for calculated file sizes')
+
     def _warn_incorrect_partition_lib_set(self, lib_set, partition, error_msg):
         for lib in lib_set.values():
             if not lib.num_users:
@@ -2140,6 +2223,69 @@
 
         file.write(template)
 
+    def _print_file_size_output(self, graph, vndk_lib, file=sys.stderr):
+        def collect_tags(lib):
+            tags = []
+            for field_name in _VNDK_RESULT_FIELD_NAMES:
+                if lib in getattr(vndk_lib, field_name):
+                    tags.append(field_name)
+            return ' '.join(tags)
+
+        writer = csv.writer(file, lineterminator='\n')
+        writer.writerow(('Path', 'Tag', 'File size', 'RO segment file size',
+                         'RO segment mem size', 'RW segment file size',
+                         'RW segment mem size'))
+
+        # Print the file size of all ELF files.
+        for lib in sorted(graph.all_libs()):
+            writer.writerow((lib.path, collect_tags(lib), lib.elf.file_size,
+                             lib.elf.ro_seg_file_size, lib.elf.ro_seg_mem_size,
+                             lib.elf.rw_seg_file_size, lib.elf.rw_seg_mem_size))
+
+        # Calculate the summation of each sets.
+        def calc_total_size(lib_set):
+            total_file_size = 0
+            total_ro_seg_file_size = 0
+            total_ro_seg_mem_size = 0
+            total_rw_seg_file_size = 0
+            total_rw_seg_mem_size = 0
+
+            for lib in lib_set:
+                total_file_size += lib.elf.file_size
+                total_ro_seg_file_size += lib.elf.ro_seg_file_size
+                total_ro_seg_mem_size += lib.elf.ro_seg_mem_size
+                total_rw_seg_file_size += lib.elf.rw_seg_file_size
+                total_rw_seg_mem_size += lib.elf.rw_seg_mem_size
+
+            return [total_file_size, total_ro_seg_file_size,
+                    total_ro_seg_mem_size, total_rw_seg_file_size,
+                    total_rw_seg_mem_size]
+
+        SEPARATOR = ('----------', None, None, None, None, None, None)
+
+        writer.writerow(SEPARATOR)
+        for tag in _VNDK_RESULT_FIELD_NAMES:
+            lib_set = getattr(vndk_lib, tag)
+            lib_set = [lib for lib in lib_set if lib.elf.is_32bit]
+            total = calc_total_size(lib_set)
+            writer.writerow(['Subtotal ' + tag + ' (32-bit)', None] + total)
+
+        writer.writerow(SEPARATOR)
+        for tag in _VNDK_RESULT_FIELD_NAMES:
+            lib_set = getattr(vndk_lib, tag)
+            lib_set = [lib for lib in lib_set if not lib.elf.is_32bit]
+            total = calc_total_size(lib_set)
+            writer.writerow(['Subtotal ' + tag + ' (64-bit)', None] + total)
+
+        writer.writerow(SEPARATOR)
+        for tag in _VNDK_RESULT_FIELD_NAMES:
+            total = calc_total_size(getattr(vndk_lib, tag))
+            writer.writerow(['Subtotal ' + tag + ' (both)', None] + total)
+
+        # Calculate the summation of all ELF files.
+        writer.writerow(SEPARATOR)
+        writer.writerow(['Total', None] + calc_total_size(graph.all_libs()))
+
     def main(self, args):
         generic_refs, graph, tagged_paths = self.create_from_args(args)
 
@@ -2157,6 +2303,10 @@
         else:
             self._print_tags(vndk_lib, args.full)
 
+        # Calculate and print file sizes.
+        if args.file_size_output:
+            with open(args.file_size_output, 'w') as fp:
+                self._print_file_size_output(graph, vndk_lib, file=fp)
         return 0
 
 
diff --git a/vndk/tools/source-deps-reviewer/sourcedr/preprocess.py b/vndk/tools/source-deps-reviewer/sourcedr/preprocess.py
index fc19d97..9176fec 100755
--- a/vndk/tools/source-deps-reviewer/sourcedr/preprocess.py
+++ b/vndk/tools/source-deps-reviewer/sourcedr/preprocess.py
@@ -206,7 +206,6 @@
         patt = re.compile(b'([^:]+):(\\d+):(.*)$')
         suspect = collections.defaultdict(list)
         for line in raw_grep.split(b'\n'):
-
             match = patt.match(line)
             if not match:
                 continue
@@ -265,21 +264,22 @@
         for pattern, is_regex in zip(patterns, is_regexs):
             if not is_regex:
                 pattern = re.escape(pattern)
-            try:
-                raw_grep = subprocess.check_output(
-                    ['csearch', '-n', pattern],
-                    cwd=os.path.expanduser(self.android_root),
-                    env=self.env)
-            except subprocess.CalledProcessError as e:
-                if e.output == b'':
-                    print('nothing found')
-                    return
+            raw_grep = self.raw_grep(pattern)
+            if raw_grep == b'':
+                continue
             processed += self.process_grep(raw_grep, pattern, is_regex)
         self.to_json(processed)
 
     def add_pattern(self, pattern, is_regex):
         if not is_regex:
             pattern = re.escape(pattern)
+        raw_grep = self.raw_grep(pattern)
+        if raw_grep == b'':
+            return
+        processed = self.process_grep(raw_grep, pattern, is_regex)
+        self.add_to_json(processed)
+
+    def raw_grep(self, pattern):
         try:
             raw_grep = subprocess.check_output(
                 ['csearch', '-n', pattern],
@@ -288,9 +288,13 @@
         except subprocess.CalledProcessError as e:
             if e.output == b'':
                 print('nothing found')
-                return
-        processed = self.process_grep(raw_grep, pattern, is_regex)
-        self.add_to_json(processed)
+                return b''
+        return raw_grep
+
+    def raw_search(self, pattern, is_regex):
+        if not is_regex:
+            pattern = re.escape(pattern)
+        return self.raw_grep(pattern)
 
     def to_json(self, processed):
         data = {}
diff --git a/vndk/tools/source-deps-reviewer/sourcedr/server.py b/vndk/tools/source-deps-reviewer/sourcedr/server.py
index 6cada2d..be4e323 100755
--- a/vndk/tools/source-deps-reviewer/sourcedr/server.py
+++ b/vndk/tools/source-deps-reviewer/sourcedr/server.py
@@ -6,9 +6,12 @@
 from flask import Flask, jsonify, render_template, request
 import argparse
 import bisect
+import collections
+from functools import cmp_to_key
 import hashlib
 import json
 import os
+import re
 import subprocess
 import sys
 import webbrowser
@@ -95,6 +98,48 @@
     save_new_pattern(patt, is_regex)
     return jsonify(result='done')
 
+
+# This function does a temporary grep to the directory
+# Not adding the result to database
+@app.route('/temporary_search')
+def _temporary_search():
+    path = request.args.get('path')
+    patt = request.args.get('pattern')
+    is_regex = request.args.get('is_regex')
+    result = engine.raw_search(patt, is_regex).decode('utf-8')
+    dic = collections.defaultdict(list)
+    patt = re.compile('([^:]+):(\\d+):(.*)$')
+    for line in result.split('\n'):
+        match = patt.match(line)
+        if not match:
+            continue
+
+        file_path = match.group(1)
+        line_no = match.group(2)
+        code = match.group(3)
+        dic[file_path].append((line_no, code))
+
+    def compare(item1, item2):
+        key1, value1 = item1
+        key2, value2 = item2
+        cnt1 = os.path.commonprefix([path, key1]).count('/')
+        cnt2 = os.path.commonprefix([path, key2]).count('/')
+        e1 = os.path.relpath(key1, path).count('/')
+        e2 = os.path.relpath(key2, path).count('/')
+        # prefer smaller edit distance
+        if e1 < e2: return -1
+        if e2 < e1: return 1
+        # prefer deeper common ancestor
+        if cnt1 > cnt2: return -1
+        if cnt2 > cnt1: return 1
+        # lexicographical order
+        if key1 < key2: return -1
+        if key2 < key1: return 1
+        return 0
+
+    result = sorted(dic.items(), key=cmp_to_key(compare))
+    return jsonify(result=json.dumps(result))
+
 @app.route('/')
 def render():
     return render_template('index.html')
diff --git a/vndk/tools/source-deps-reviewer/sourcedr/static/css/main.css b/vndk/tools/source-deps-reviewer/sourcedr/static/css/main.css
index 933f73a..11bb7bc 100644
--- a/vndk/tools/source-deps-reviewer/sourcedr/static/css/main.css
+++ b/vndk/tools/source-deps-reviewer/sourcedr/static/css/main.css
@@ -1,13 +1,26 @@
 h3, h4 {
-	display: inline-block;
+    display: inline-block;
 }
 
 pre {
-	white-space: pre-wrap;       /* Since CSS 2.1 */
-	white-space: -moz-pre-wrap;  /* Mozilla, since 1999 */
-	white-space: -pre-wrap;      /* Opera 4-6 */
-	white-space: -o-pre-wrap;    /* Opera 7 */
-	word-wrap: break-word;       /* Internet Explorer 5.5+ */
-	background-color: #ffffff;
-	margin: 0;
+    white-space: pre-wrap;       /* Since CSS 2.1 */
+    white-space: -moz-pre-wrap;  /* Mozilla, since 1999 */
+    white-space: -pre-wrap;      /* Opera 4-6 */
+    white-space: -o-pre-wrap;    /* Opera 7 */
+    word-wrap: break-word;       /* Internet Explorer 5.5+ */
+    background-color: #ffffff;
+    margin: 0;
+}
+
+@media (min-width: 768px) {
+    .modal-xl {
+        width: 90%;
+        max-width:1200px;
+    }
+}
+
+.affix {
+  top:50px;
+  right:0;
+  position:fixed;
 }
diff --git a/vndk/tools/source-deps-reviewer/sourcedr/static/js/main.js b/vndk/tools/source-deps-reviewer/sourcedr/static/js/main.js
index e11d26c..db62041 100644
--- a/vndk/tools/source-deps-reviewer/sourcedr/static/js/main.js
+++ b/vndk/tools/source-deps-reviewer/sourcedr/static/js/main.js
@@ -37,6 +37,33 @@
     return pretag;
   }
 
+  function grepResultHtml(items) {
+    let ret = document.createElement('p');
+    for (let i = 0; i < items.length; i++) {
+      let path = document.createElement('span');
+      path.style.color = 'purple';
+      path.style.fontSize = '20px';
+      path.innerHTML = items[i][0];
+      ret.appendChild(path);
+      ret.appendChild(document.createElement('br'));
+      for (let j = 0; j < items[0][1].length; j++) {
+        let line_no = items[i][1][j][0];
+        let content = items[i][1][j][1];
+        let line_html = document.createElement('font');
+        line_html.style.color = 'green';
+        line_html.style.fontSize = '18px';
+        line_html.innerHTML = line_no + ':';
+        ret.appendChild(line_html);
+        let content_html = document.createElement('span');
+        content_html.style.fontSize = '18px';
+        content_html.appendChild(document.createTextNode(content));
+        ret.appendChild(content_html);
+        ret.appendChild(document.createElement('br'));
+      }
+    }
+    return ret;
+  }
+
   function enterTask() {
     let text = $('#enter_deps').val();
     $('#deps_list').append(taskHtml(text, counter));
@@ -104,7 +131,6 @@
       for (let i = 0; i < len; i++) {
         $('#pattern_list').append('<li>' + pattern_lst[i] + '</li>');
       }
-
       $('#path_prefix').text(data.path_prefix);
     });
   }
@@ -199,6 +225,7 @@
     setGotoPatternLine(line_no);
     $('#selected_text').val('');
     $('#code_file_path').val('');
+    $('#enter_deps').val('');
     $('html,body').scrollTop(0);
     return false;
   }
@@ -227,8 +254,30 @@
       pattern: values['pattern'],
       is_regex: $('#is_regex').is(':checked') ? 1 : 0
     });
+    return true;
+  });
+
+  $('#temporary_search').submit(function() {
+    const $inputs = $('#temporary_search :input');
+    let values = {};
+    $inputs.each(function () {
+      values[this.name] = $(this).val();
+    });
+    $('#modal_title').text(values['pattern']);
+    $.getJSON('/temporary_search', {
+      path: $('#file_path').text(),
+      pattern: values['pattern'],
+      is_regex: $('#is_regex2').is(':checked') ? 1 : 0
+    }, function (data) {
+        $('#modal_body').append(grepResultHtml(JSON.parse(data.result)));
+        $('#myModal').modal('show');
+    });
     return false;
   });
+  // clear previous html code in modal on hide
+  $('#myModal').on('hidden.bs.modal', function () {
+    $('#modal_body').empty();
+  })
 
   $('#add_deps').submit(enterTask);
   $('#add_code').submit(enterCode);
diff --git a/vndk/tools/source-deps-reviewer/sourcedr/static/prism/js/prism.js b/vndk/tools/source-deps-reviewer/sourcedr/static/prism/js/prism.js
index 758b01b..743a225 100644
--- a/vndk/tools/source-deps-reviewer/sourcedr/static/prism/js/prism.js
+++ b/vndk/tools/source-deps-reviewer/sourcedr/static/prism/js/prism.js
@@ -635,9 +635,17 @@
 	}
 }());
 
+function getOffsetById(id) {
+	var element = document.getElementById(id);
+	var bodyRect = document.body.getBoundingClientRect();
+	var elemRect = element.getBoundingClientRect();
+	var elementOffset = elemRect.top - bodyRect.top;
+	return elementOffset;
+}
+
 function highlightLines(pre, lines, classes) {
-	var ranges = lines.replace(/\s+/g, '').split(','),
-	    offset = +pre.getAttribute('data-line-offset') || 0;
+	var ranges = lines.replace(/\s+/g, '').split(',');
+	var offset = getOffsetById('browsing_file');
 
 	var parseMethod = isLineHeightRounded() ? parseInt : parseFloat;
 	var lineHeight = parseMethod(getComputedStyle(pre).lineHeight);
@@ -663,7 +671,7 @@
 			}
 		}
 
-		line.style.top = (start - offset - 1) * lineHeight + 'px';
+		line.style.top = (getOffsetById('line_no' + start) - offset) + 'px';
 
 		//allow this to play nicely with the line-numbers plugin
 		if(hasClass(pre, 'line-numbers')) {
@@ -734,33 +742,6 @@
 	}
 });
 
-Prism.hooks.add('complete', function(env) {
-	var pre = env.element.parentNode;
-	var lines = pre && pre.getAttribute('data-line');
-
-	if (!pre || !lines || !/pre/i.test(pre.nodeName)) {
-		return;
-	}
-
-	clearTimeout(fakeTimer);
-
-	highlightLines(pre, lines);
-
-	fakeTimer = setTimeout(applyHash, 1);
-});
-
-if(window.addEventListener) {
-	window.addEventListener('hashchange', applyHash);
-}
-
-})();
-
-(function() {
-
-if (typeof self === 'undefined' || !self.Prism || !self.document) {
-	return;
-}
-
 Prism.hooks.add('complete', function (env) {
 	if (!env.code) {
 		return;
@@ -795,8 +776,10 @@
 	var linesNum = match ? match.length + 1 : 1;
 	var lineNumbersWrapper;
 
-	var lines = new Array(linesNum + 1);
-	lines = lines.join('<span></span>');
+	var lines = '';
+	for (let i = 1; i < linesNum + 1; i++) {
+		lines += '<span id="line_no' + i + '"></span>';
+	}
 
 	lineNumbersWrapper = document.createElement('span');
 	lineNumbersWrapper.setAttribute('aria-hidden', 'true');
@@ -811,4 +794,31 @@
 
 });
 
+Prism.hooks.add('complete', function(env) {
+	var pre = env.element.parentNode;
+	var lines = pre && pre.getAttribute('data-line');
+
+	if (!pre || !lines || !/pre/i.test(pre.nodeName)) {
+		return;
+	}
+
+	clearTimeout(fakeTimer);
+
+	highlightLines(pre, lines);
+
+	fakeTimer = setTimeout(applyHash, 1);
+});
+
+if(window.addEventListener) {
+	window.addEventListener('hashchange', applyHash);
+}
+
+})();
+
+(function() {
+
+if (typeof self === 'undefined' || !self.Prism || !self.document) {
+	return;
+}
+
 }());
diff --git a/vndk/tools/source-deps-reviewer/sourcedr/templates/index.html b/vndk/tools/source-deps-reviewer/sourcedr/templates/index.html
index e46b3bf..9cf75ec 100644
--- a/vndk/tools/source-deps-reviewer/sourcedr/templates/index.html
+++ b/vndk/tools/source-deps-reviewer/sourcedr/templates/index.html
@@ -32,8 +32,17 @@
     </div>
     <br>
 
-    <div class="col-sm-4">
+    <div class="col-sm-4" data-spy="affix">
+
       <div class="well">
+        <h3>Temporary search</h3>
+        <form id="temporary_search" class="input-group" style="padding-left:20px;">
+          <span class="input-group-addon">is regex</span>
+          <span class="input-group-addon">
+            <input type="checkbox" name="is_regex2" id="is_regex2">
+          </span>
+          <input type="text" name="pattern" class="form-control">
+        </form>
         <h3>Add patterns to grep</h3>
         <form id="add_pattern" class="input-group" style="padding-left:20px;">
           <span class="input-group-addon">is regex</span>
@@ -43,12 +52,12 @@
           <input type="text" name="pattern" class="form-control">
         </form>
         <ul id="pattern_list"></ul>
-        <h3>File path:</h3>
+      </div>
+      <div class="well">
+        <h3>File labeling:</h3>
         <pre style="padding-left:20px;"><h4 id="file_path"></h4></pre>
         <h3>Pattern line number:</h3>
         <h3 id="line_no"></h3><br>
-      </div>
-      <div class="well">
         <h3>Library Dependencies</h3>
         <form id="add_deps" class="input-group">
           <input type="text" class="form-control" id="enter_deps" placeholder="Fill in * if undetermined"/>
@@ -57,15 +66,14 @@
           </span>
         </form>
         <ul id="deps_list"></ul>
-
         <h3>Code Dependencies</h3>
         <form id="add_code">
           <input class="btn btn-secondary" type="button" id="get_selection" value="Get selection"/>
           <input class="btn btn-secondary" type="submit" id="add_code" value="Add"/><br>
           <input type="text" id="code_file_path" style="margin: 0px; width: 100%;"/>
           <textarea id="selected_text" name="selectedtext" rows="5" style="margin: 0px; width: 100%; height: 106px;"></textarea>
-          <ul id="code_list"></ul>
         </form>
+        <ul id="code_list"></ul>
         <form id="save_all">
           <input class="btn btn-secondary" type="submit" value="Save All"/>
         </form>
@@ -74,11 +82,27 @@
   </div>
 </div>
 
+<!-- Modal -->
+<div class="modal fade" id="myModal" role="dialog">
+  <div class="modal-dialog modal-xl">
+    <!-- Modal content-->
+    <div class="modal-content">
+      <div class="modal-header">
+        <button type="button" class="close" data-dismiss="modal">&times;</button>
+        <h4 id="modal_title" class="modal-title"></h4>
+      </div>
+      <div id="modal_body" class="modal-body">
+      </div>
+      <div class="modal-footer">
+        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
+      </div>
+    </div>
+  </div>
+</div>
 
 <script type="text/javascript" src="static/js/main.js"></script>
 <!-- for code prettyify -->
 <script src="static/prism/js/prism.js"></script>
-<script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js"></script>
 
 </body>
 </html>