mach_vm_region_recurse, asignando memoria y bibliotecas compartidas en osx

Estoy usando vm_region_recurse_64 para mapear la memoria para un proceso dado, estilo vmmap.

Intentando obtener una lista completa de las bibliotecas compartidas cargadas por la aplicación examinando el encabezado Mach-O de cada biblioteca en la memoria, sin embargo, vm_region_recurse parece estar en desacuerdo con la herramienta de línea de comando vmmap sobre específicamente dónde comienzan y terminan algunas de las secciones de memoria específicas. @

Esto se vuelve especialmente cierto en el submapa del sistema 90000000-a0000000 donde se cargan la mayoría de las bibliotecas compartidas del sistema operativ

Y ahora estoy un poco perplejo. Puedo enumerar segmentos de memoria, decir en general de qué tipo son y leerlos con vm_read. Pero enumerándolos y obteniendocorrect e información específica de la región está resultando difícil.

¿Cómo vmmap obtiene listados de las ubicaciones específicas en las que se cargan las bibliotecas? Mi método parece ser ineficaz.

Edit: aquí está el código básico que estoy usando. Devuelve un mapa de memoria similar pero no idéntico al de vmmap. No tiene regiones de memoria de bibliotecas específicas.

kern_return_t krc = KERN_SUCCESS;
vm_address_t address = 0;
vm_size_t size = 0;
uint32_t depth = 1;
while (1) {
    struct vm_region_submap_info_64 info;
    mach_msg_type_number_t count = VM_REGION_SUBMAP_INFO_COUNT_64;
    krc = vm_region_recurse_64(port, &address, &size, &depth, (vm_region_info_64_t)&info, &count);
    if (krc == KERN_INVALID_ADDRESS){
        break;
    }
    if (info.is_submap){
        depth++;
    }
    else {
        //do stuff
        printf ("Found region: %08x to %08x\n", (uint32_t)address, (uint32_t)address+size);
        address += size;
    }
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta