diff --git a/lib/libc/gen/elf_utils.c b/lib/libc/gen/elf_utils.c index 06c91e05748..4ba467977ac 100644 --- a/lib/libc/gen/elf_utils.c +++ b/lib/libc/gen/elf_utils.c @@ -47,8 +47,14 @@ __elf_phdr_match_addr(struct dl_phdr_info *phdr_info, void *addr) for (i = 0; i < phdr_info->dlpi_phnum; i++) { ph = &phdr_info->dlpi_phdr[i]; +#if defined(__powerpc64__) && (!defined(_CALL_ELF) || _CALL_ELF == 1) + /* PPC64 ELFv1 is special -- function pointers live in .opd. */ + if (ph->p_type != PT_LOAD) + continue; +#else if (ph->p_type != PT_LOAD || (ph->p_flags & PF_X) == 0) continue; +#endif if (phdr_info->dlpi_addr + ph->p_vaddr <= (uintptr_t)addr && (uintptr_t)addr + sizeof(addr) < phdr_info->dlpi_addr + ph->p_vaddr + ph->p_memsz)