Android7.0 精灵文件读取 Elf32_Dyn 结果不正确?

Android7.0 Elf file read Elf32_Dyn Incorrect result?

static void getSegmentInfo(ElfInfo &info, const Elf32_Word type, Elf32_Phdr **pPhdr, Elf32_Word *pSize,
           T *data) {
    Elf32_Phdr *_phdr = findSegmentByType(info, type);
    if (_phdr) {
        if (info.handle->fromfile) { 
            SAFE_SET_VALUE(data, reinterpret_cast<T>(info.elf_base + _phdr->p_offset));
            SAFE_SET_VALUE(pSize, _phdr->p_filesz);
        } else { 
            SAFE_SET_VALUE(data, reinterpret_cast<T>(info.elf_base + _phdr->p_vaddr));
            SAFE_SET_VALUE(pSize, _phdr->p_memsz);
        }
    } else {
        LOGI("find segment fail!");
        exit(-1);
    }
    SAFE_SET_VALUE(pPhdr, _phdr);
}

void getElfInfoBySegmentView(ElfInfo &info, const ElfHandle *handle) {
info.handle = handle;
info.elf_base = (uint8_t *) handle->base; 
info.ehdr = reinterpret_cast<Elf32_Ehdr *>(info.elf_base); 
info.shdr = reinterpret_cast<Elf32_Shdr *>(info.elf_base + info.ehdr->e_shoff); 
info.phdr = reinterpret_cast<Elf32_Phdr *>(info.elf_base + info.ehdr->e_phoff);
info.shstr = NULL;
Elf32_Phdr *dynamic = NULL;
Elf32_Word size = 0; 
getSegmentInfo(info, PT_DYNAMIC, &dynamic, &size, &info.dyn);
if (!dynamic) {
    LOGI("Error );
    exit(-1);
}
info.dynsz = size / sizeof(Elf32_Dyn);
Elf32_Dyn *dyn = info.dyn;
}

我读取了/system/lib/libart.so通过上面的代码,然后解析,我查看010editor的struct dynamic_link_table地址是正确的,在Android4.4 DVM中,Elf32_Dyn *动态 = info.dyn; 运行 的结果是正确的,但在 Android7.0 中,运行 Elf32_Dyn *dyn = info.dyn; dyn 是不正确的结果

Android6.0偏移后需要添加[程序头table(R__)Loadable Segmentp_vaddr]值

所以,效果不错!!!