Work around for libraries without dt_soname

 Applies only for apps targeting sdk version <= 22

Bug: http://b/21565766
Change-Id: If0bf2229dc1341e9ca09f9a05d0890515273d5a2
diff --git a/linker/linker.cpp b/linker/linker.cpp
index 02ee9c7..a0f82fc 100644
--- a/linker/linker.cpp
+++ b/linker/linker.cpp
@@ -2875,6 +2875,19 @@
     DL_ERR("empty/missing DT_SYMTAB in \"%s\"", get_realpath());
     return false;
   }
+
+  // Before M release linker was using basename in place of soname.
+  // In the case when dt_soname is absent some apps stop working:
+  // because they can't find dt_needed library by soname.
+  // This workaround should keep them working. (applies only
+  // for apps targeting sdk version <=22). Make an exception for main
+  // executable which does not need dt_soname.
+  uint32_t target_sdk_version = get_application_target_sdk_version();
+  if (soname_ == nullptr && this != somain && target_sdk_version != 0 && target_sdk_version <= 22) {
+    soname_ = basename(realpath_.c_str());
+    DL_WARN("%s: is missing DT_SONAME will use basename as a replacement: \"%s\"",
+        get_realpath(), soname_);
+  }
   return true;
 }