From dwfl_module_getdwarf: @@ -96,11 +100,18 @@ open_elf (Dwfl_Module *mod, struct dwfl_file *file) goto elf_error; if (ph->p_type == PT_LOAD) { - file->bias = ((mod->low_addr & -ph->p_align) - - (ph->p_vaddr & -ph->p_align)); + // Align the vaddr. + fprintf(stderr, "mod->low_addr 0x%lx\n", mod->low_addr); + fprintf(stderr, "ph->p_align 0x%lx\n", ph->p_align); + Dwarf_Addr vaddr = ph->p_vaddr & -ph->p_align; + fprintf(stderr, "vaddr 0x%lx\n", vaddr); + file->bias = (mod->low_addr - (ph->p_vaddr & -ph->p_align)); + fprintf(stderr, "setting file bias to something complex 0x%lx\n", + file->bias); break; } } + } mod->e_type = ehdr->e_type; for instance, an solib mapped at: low 0x2aaab0508000 high 0x2aaab07dc000 with alignment 0x200000, will result in a bias of 0x2aaab0400000, when it should just be the low address
upstream: https://bugzilla.redhat.com/show_bug.cgi?id=450218
This has been submitted upstream. 2008-06-07 Andrew Cagney <cagney@redhat.com> * dwfl_module_getdwarf.c (open_elf): Don't align the module's load address. Bug frysk/6599, redhat/450218.