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);
}