From e93be99da0614ff38cbf8b2bb0624ff1dc79b8d0 Mon Sep 17 00:00:00 2001 From: Ningsheng Jian Date: Tue, 16 Sep 2014 15:22:10 +0800 Subject: [PATCH] Fix gdb could not get shared library list issue Get dynamic flags from phdr table's correct entry rather the first entry, so that the following DT_DEBUG entry can be set. Also fix the undefined reference to LoadTask::deleter issue under gcc -O0 option. Bug: 17524778 Change-Id: I9c679af197b034761fb739d6c980e628ff2ab84c --- linker/linker.cpp | 10 ++++++---- linker/linker_phdr.cpp | 7 ++++++- linker/linker_phdr.h | 3 ++- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/linker/linker.cpp b/linker/linker.cpp index f11cfdbce..09ffa2399 100644 --- a/linker/linker.cpp +++ b/linker/linker.cpp @@ -612,6 +612,8 @@ class LoadTask { DISALLOW_IMPLICIT_CONSTRUCTORS(LoadTask); }; +LoadTask::deleter_t LoadTask::deleter; + template using linked_list_t = LinkedList>>; @@ -1826,7 +1828,9 @@ static int nullify_closed_stdio() { } bool soinfo::PrelinkImage() { - phdr_table_get_dynamic_section(phdr, phnum, load_bias, &dynamic); + /* Extract dynamic section */ + ElfW(Word) dynamic_flags = 0; + phdr_table_get_dynamic_section(phdr, phnum, load_bias, &dynamic, &dynamic_flags); /* We can't log anything until the linker is relocated */ bool relocating_linker = (flags & FLAG_LINKER) != 0; @@ -1835,8 +1839,6 @@ bool soinfo::PrelinkImage() { DEBUG("si->base = %p si->flags = 0x%08x", reinterpret_cast(base), flags); } - /* Extract dynamic section */ - ElfW(Word) dynamic_flags = phdr->p_flags; if (dynamic == nullptr) { if (!relocating_linker) { DL_ERR("missing PT_DYNAMIC in \"%s\"", name); @@ -2228,7 +2230,7 @@ static void init_linker_info_for_gdb(ElfW(Addr) linker_base) { ElfW(Ehdr)* elf_hdr = reinterpret_cast(linker_base); ElfW(Phdr)* phdr = reinterpret_cast(linker_base + elf_hdr->e_phoff); phdr_table_get_dynamic_section(phdr, elf_hdr->e_phnum, linker_base, - &linker_soinfo_for_gdb.dynamic); + &linker_soinfo_for_gdb.dynamic, nullptr); insert_soinfo_into_debug_map(&linker_soinfo_for_gdb); } diff --git a/linker/linker_phdr.cpp b/linker/linker_phdr.cpp index 436517271..44c8e9e70 100644 --- a/linker/linker_phdr.cpp +++ b/linker/linker_phdr.cpp @@ -702,15 +702,20 @@ 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_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) { + ElfW(Addr) load_bias, ElfW(Dyn)** dynamic, + ElfW(Word)* dynamic_flags) { *dynamic = nullptr; 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(load_bias + phdr->p_vaddr); + if (dynamic_flags) { + *dynamic_flags = phdr->p_flags; + } return; } } diff --git a/linker/linker_phdr.h b/linker/linker_phdr.h index d4c3ce85f..593fb5a20 100644 --- a/linker/linker_phdr.h +++ b/linker/linker_phdr.h @@ -101,6 +101,7 @@ int phdr_table_get_arm_exidx(const ElfW(Phdr)* phdr_table, size_t phdr_count, El #endif void phdr_table_get_dynamic_section(const ElfW(Phdr)* phdr_table, size_t phdr_count, - ElfW(Addr) load_bias, ElfW(Dyn)** dynamic); + ElfW(Addr) load_bias, ElfW(Dyn)** dynamic, + ElfW(Word)* dynamic_flags); #endif /* LINKER_PHDR_H */ -- 2.11.0