Index: dumper.c =================================================================== --- dumper.c (revision 157971) +++ dumper.c (working copy) @@ -432,7 +432,7 @@ for(seg = 0, i = 0; i < num; i++) { if(!(mapinfos[i].flags & PG_HWMAPPED) || - (nodumpmem && !(mapinfos[i].flags & MAP_STACK)) ) { + (nodumpmem && !(mapinfos[i].flags & (MAP_STACK|MAP_ELF))) ) { continue; } if ( (nodumpphys && (mapinfos[i].flags & MAP_PHYS) && !(mapinfos[i].flags & MAP_ANON)) ) { @@ -449,12 +449,22 @@ seg++; } + num = seg; dprintf(("ldd mapinfos:\n")); for(i = 0; i < n_ldd_infos; i++) { + for ( j = 0; j < num; j++ ) { + if ( ldd_infos[i].vaddr >= mem[j].vaddr && + (ldd_infos[i].vaddr+ldd_infos[i].size <= (mem[j].vaddr + mem[j].size))) { +// dprintf(("not adding %svaddr=%#llx, offset=%#llx, size=%#llx, flags=%#x\n", ldd_infos[i].flags & PG_HWMAPPED?"*":"", ldd_infos[i].vaddr, ldd_infos[i].offset, ldd_infos[i].size, ldd_infos[i].flags )); + break; + } + } + if ( j == num ) { dprintf(("%svaddr=%#llx, offset=%#llx, size=%#llx, flags=%#x\n", ldd_infos[i].flags & PG_HWMAPPED?"*":"", ldd_infos[i].vaddr, ldd_infos[i].offset, ldd_infos[i].size, ldd_infos[i].flags )); - memcpy( &mem[seg], &ldd_infos[i], sizeof(*mem));; + memcpy( &mem[seg], &ldd_infos[i], sizeof(*mem)); seg++; } + } free(mapinfos); mapinfos = NULL; if(n_ldd_infos) { @@ -644,7 +654,7 @@ if ( mem[j].flags & MAP_STACK ) dump_stack_memory( fd, fp, &mem[j], &coresize ); else - if (!nodumpmem) + if (!nodumpmem || (mem[j].flags & MAP_ELF)) dump_memory( fd, fp, &mem[j], &coresize ); }