linker: don't pass dlextinfo to dependent loads

Don't pass the parent load's dlextinfo to dependent loads, since this
causes the linker to try to load the dependencies using the same
addresses/relro/fds/etc as the main library, which is never going to
work. This was how it worked before ae69a95 which broke this.

Bug: http://b/23742664
Bug: http://b/20948231
Bug: http://b/20841817
Change-Id: I340ebae1127666d5c6c6f9c6521b89fb93f15bdd
diff --git a/linker/linker.cpp b/linker/linker.cpp
index 4428e51..3967ad5 100644
--- a/linker/linker.cpp
+++ b/linker/linker.cpp
@@ -1525,13 +1525,16 @@
   for (LoadTask::unique_ptr task(load_tasks.pop_front());
       task.get() != nullptr; task.reset(load_tasks.pop_front())) {
     soinfo* needed_by = task->get_needed_by();
+    bool is_dt_needed = needed_by != nullptr && (needed_by != start_with || add_as_children);
+
     soinfo* si = find_library_internal(load_tasks, task->get_name(), needed_by,
-                                       rtld_flags, extinfo);
+                                       rtld_flags,
+                                       is_dt_needed ? nullptr : extinfo);
     if (si == nullptr) {
       return false;
     }
 
-    if (needed_by != nullptr && (needed_by != start_with || add_as_children)) {
+    if (is_dt_needed) {
       needed_by->add_child(si);
     }
 
diff --git a/tests/dlext_test.cpp b/tests/dlext_test.cpp
index f901708..44b899e 100644
--- a/tests/dlext_test.cpp
+++ b/tests/dlext_test.cpp
@@ -114,6 +114,10 @@
   fn f = reinterpret_cast<fn>(dlsym(handle_, "getRandomNumber"));
   ASSERT_DL_NOTNULL(f);
   EXPECT_EQ(4, f());
+
+  uint32_t* taxicab_number = reinterpret_cast<uint32_t*>(dlsym(handle_, "dlopen_testlib_taxicab_number"));
+  ASSERT_DL_NOTNULL(taxicab_number);
+  EXPECT_EQ(1729U, *taxicab_number);
 }
 
 TEST_F(DlExtTest, ExtInfoUseFdWithOffset) {
@@ -372,6 +376,10 @@
     fn f = reinterpret_cast<fn>(dlsym(handle_, "getRandomNumber"));
     ASSERT_DL_NOTNULL(f);
     EXPECT_EQ(4, f());
+
+    uint32_t* taxicab_number = reinterpret_cast<uint32_t*>(dlsym(handle_, "dlopen_testlib_taxicab_number"));
+    ASSERT_DL_NOTNULL(taxicab_number);
+    EXPECT_EQ(1729U, *taxicab_number);
   }
 
   void SpawnChildrenAndMeasurePss(const char* lib, bool share_relro, size_t* pss_out);
diff --git a/tests/libs/Android.mk b/tests/libs/Android.mk
index 8615934..b13400e 100644
--- a/tests/libs/Android.mk
+++ b/tests/libs/Android.mk
@@ -68,6 +68,8 @@
 libdlext_test_ldflags := \
     -Wl,-z,relro \
 
+libdlext_test_shared_libraries := libtest_simple
+
 module := libdlext_test
 module_tag := optional
 include $(LOCAL_PATH)/Android.build.testlib.mk
@@ -101,6 +103,8 @@
 libdlext_test_norelro_ldflags := \
     -Wl,-z,norelro \
 
+libdlext_test_norelro_shared_libraries := libtest_simple
+
 module := libdlext_test_norelro
 module_tag := optional
 build_type := target
@@ -113,6 +117,8 @@
 libdlext_test_fd_src_files := \
     dlext_test_library.cpp \
 
+libdlext_test_fd_shared_libraries := libtest_simple
+
 libdlext_test_fd_install_to_out_data := true
 module := libdlext_test_fd
 module_tag := optional