Snap for 5688406 from 3aa7c19c0ab25a462b2c1fbe8893d7025bf1a1ce to qt-aml-release

Change-Id: I2c786da5d359d911200aa55cd9626852da694944
diff --git a/dependency/VtsVndkDependencyTest.py b/dependency/VtsVndkDependencyTest.py
index 4878978..0302220 100644
--- a/dependency/VtsVndkDependencyTest.py
+++ b/dependency/VtsVndkDependencyTest.py
@@ -154,9 +154,48 @@
         if target_file_utils.IsExecutable(permissions):
             return True
 
-        logging.debug("%s is not for application processor", target_path)
         return False
 
+    def _IsElfObjectBuiltForAndroid(self, elf, target_path):
+        """Checks whether an ELF object is built for Android.
+
+        Some ELF objects in vendor partition require special program
+        interpreters. Such executable files have .interp sections, but shared
+        libraries don't. As there is no reliable way to identify those
+        libraries. This method checks .note.android.ident section which is
+        created by Android build system.
+
+        Args:
+            elf: The object of elf_parser.ElfParser.
+            target_path: The path to the ELF file on target.
+
+        Returns:
+            A boolean, whether the ELF object is built for Android.
+        """
+        # b/133399940 Skip an ELF file if it does not have .note.android.ident
+        # section and meets one of the following conditions:
+        if elf.HasAndroidIdent():
+            return True
+
+        # It's in the specific directory and is a shared library.
+        if (target_path.startswith("/vendor/arib/lib/") and
+                ".so" in target_path and
+                elf.IsSharedObject()):
+            return False
+
+        # It's in the specific directory, requires special program interpreter,
+        # and is executable.
+        if target_path.startswith("/vendor/arib/bin/"):
+            interp = elf.GetProgramInterpreter()
+            if interp and interp not in self._DEFAULT_PROGRAM_INTERPRETERS:
+                permissions = target_file_utils.GetPermission(target_path,
+                                                              self._dut.shell)
+                if (elf.IsExecutable() or
+                        target_file_utils.IsExecutable(permissions)):
+                    return False
+
+        return True
+
     def _LoadElfObjects(self, host_dir, target_dir, abi_list,
                         elf_error_handler):
         """Scans a host directory recursively and loads all ELF files in it.
@@ -185,7 +224,13 @@
                 continue
             try:
                 if not self._IsElfObjectForAp(elf, target_path, abi_list):
+                    logging.info("%s is not for application processor",
+                                 target_path)
                     continue
+                if not self._IsElfObjectBuiltForAndroid(elf, target_path):
+                    logging.info("%s is not built for Android", target_path)
+                    continue
+
                 deps = elf.ListDependencies()
             except elf_parser.ElfError as e:
                 elf_error_handler(target_path, e)