diff options
author | Dmitriy Ivanov <dimitry@google.com> | 2014-07-29 14:21:45 -0700 |
---|---|---|
committer | Dmitriy Ivanov <dimitry@google.com> | 2014-09-03 15:06:14 -0700 |
commit | a3ad450a2e3fb6b3fe359683b247eba20896f646 (patch) | |
tree | 46d55ca77bbe24d4834444ed21aa146bf6750e37 /linker/linker_phdr.cpp | |
parent | ec95a9cf11f7c4d2211c61da7ce05262a54409d1 (diff) | |
download | bionic-a3ad450a2e3fb6b3fe359683b247eba20896f646.tar.gz |
Load libraries in breadth-first order
This patch fixes the problem with symbol search order
for dlsym(RTLD_DEFAULT/RTLD_NEXT, .) by loading libraries
and ld_preloads in correct order.
Bug: https://code.google.com/p/android/issues/detail?id=74255
Change-Id: I4cf84c70dbaabe99310230dfda12385ae5401859
Diffstat (limited to 'linker/linker_phdr.cpp')
-rw-r--r-- | linker/linker_phdr.cpp | 29 |
1 files changed, 6 insertions, 23 deletions
diff --git a/linker/linker_phdr.cpp b/linker/linker_phdr.cpp index 1bbd57778..436517271 100644 --- a/linker/linker_phdr.cpp +++ b/linker/linker_phdr.cpp @@ -702,34 +702,17 @@ int phdr_table_get_arm_exidx(const ElfW(Phdr)* phdr_table, size_t phdr_count, * load_bias -> load bias * Output: * dynamic -> address of table in memory (null on failure). - * dynamic_count -> number of items in table (0 on failure). - * dynamic_flags -> protection flags for section (unset on failure) * Return: * void */ void phdr_table_get_dynamic_section(const ElfW(Phdr)* phdr_table, size_t phdr_count, - ElfW(Addr) load_bias, - ElfW(Dyn)** dynamic, size_t* dynamic_count, ElfW(Word)* dynamic_flags) { - const ElfW(Phdr)* phdr = phdr_table; - const ElfW(Phdr)* phdr_limit = phdr + phdr_count; - - for (phdr = phdr_table; phdr < phdr_limit; phdr++) { - if (phdr->p_type != PT_DYNAMIC) { - continue; - } - - *dynamic = reinterpret_cast<ElfW(Dyn)*>(load_bias + phdr->p_vaddr); - if (dynamic_count) { - *dynamic_count = (unsigned)(phdr->p_memsz / 8); - } - if (dynamic_flags) { - *dynamic_flags = phdr->p_flags; - } - return; - } + ElfW(Addr) load_bias, ElfW(Dyn)** dynamic) { *dynamic = nullptr; - if (dynamic_count) { - *dynamic_count = 0; + for (const ElfW(Phdr)* phdr = phdr_table, *phdr_limit = phdr + phdr_count; phdr < phdr_limit; phdr++) { + if (phdr->p_type == PT_DYNAMIC) { + *dynamic = reinterpret_cast<ElfW(Dyn)*>(load_bias + phdr->p_vaddr); + return; + } } } |