diff --git a/linker/linker.cpp b/linker/linker.cpp index 4428e511e..3967ad55e 100644 --- a/linker/linker.cpp +++ b/linker/linker.cpp @@ -1525,13 +1525,16 @@ static bool find_libraries(soinfo* start_with, 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 f901708bc..44b899e91 100644 --- a/tests/dlext_test.cpp +++ b/tests/dlext_test.cpp @@ -114,6 +114,10 @@ TEST_F(DlExtTest, ExtInfoUseFd) { fn f = reinterpret_cast(dlsym(handle_, "getRandomNumber")); ASSERT_DL_NOTNULL(f); EXPECT_EQ(4, f()); + + uint32_t* taxicab_number = reinterpret_cast(dlsym(handle_, "dlopen_testlib_taxicab_number")); + ASSERT_DL_NOTNULL(taxicab_number); + EXPECT_EQ(1729U, *taxicab_number); } TEST_F(DlExtTest, ExtInfoUseFdWithOffset) { @@ -372,6 +376,10 @@ protected: fn f = reinterpret_cast(dlsym(handle_, "getRandomNumber")); ASSERT_DL_NOTNULL(f); EXPECT_EQ(4, f()); + + uint32_t* taxicab_number = reinterpret_cast(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 86159348d..b13400e84 100644 --- a/tests/libs/Android.mk +++ b/tests/libs/Android.mk @@ -68,6 +68,8 @@ libdlext_test_src_files := \ 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_src_files := \ 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 @@ include $(TEST_PATH)/Android.build.mk 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