int mono_mmap_map (void *handle, gint64 offset, gint64 *size, int access, void **mmap_handle, void **base_address) { gint64 mmap_offset = 0; MmapHandle *fh = handle; MmapInstance res = { 0 }; size_t eff_size = *size; struct stat buf = { 0 }; fstat (fh->fd, &buf); //FIXME error handling /** * We use the file size if one of the following conditions is true: * -input size is zero * -input size is bigger than the file and the file is not a magical zero size file such as /dev/mem. */ if (eff_size == 0 || (eff_size > buf.st_size && !is_special_zero_size_file (&buf))) eff_size = buf.st_size; *size = eff_size; mmap_offset = align_down_to_page_size (offset); eff_size += (offset - mmap_offset); //FIXME translate some interesting errno values res.address = mono_file_map ((size_t)eff_size, acess_to_mmap_flags (access), fh->fd, mmap_offset, &res.free_handle); res.length = eff_size; if (res.address) { *mmap_handle = g_memdup (&res, sizeof (MmapInstance)); *base_address = (char*)res.address + (offset - mmap_offset); return 0; } *mmap_handle = NULL; *base_address = NULL; return COULD_NOT_MAP_MEMORY; }
MonoSymbolFile * mono_debug_open_mono_symbols (MonoDebugHandle *handle, const uint8_t *raw_contents, int size, gboolean in_the_debugger) { MonoSymbolFile *symfile; mono_debugger_lock (); symfile = g_new0 (MonoSymbolFile, 1); if (raw_contents != NULL) { unsigned char *p; symfile->raw_contents_size = size; symfile->raw_contents = p = (unsigned char *)g_malloc (size); memcpy (p, raw_contents, size); symfile->filename = g_strdup_printf ("LoadedFromMemory"); symfile->was_loaded_from_memory = TRUE; } else { MonoFileMap *f; symfile->filename = g_strdup_printf ("%s.mdb", mono_image_get_filename (handle->image)); symfile->was_loaded_from_memory = FALSE; if ((f = mono_file_map_open (symfile->filename))) { symfile->raw_contents_size = mono_file_map_size (f); if (symfile->raw_contents_size == 0) { if (!in_the_debugger) g_warning ("stat of %s failed: %s", symfile->filename, g_strerror (errno)); } else { symfile->raw_contents = (const unsigned char *)mono_file_map (symfile->raw_contents_size, MONO_MMAP_READ|MONO_MMAP_PRIVATE, mono_file_map_fd (f), 0, &symfile->raw_contents_handle); } mono_file_map_close (f); } } if (load_symfile (handle, symfile, in_the_debugger)) { mono_debugger_unlock (); return symfile; } else if (!in_the_debugger) { mono_debug_close_mono_symbol_file (symfile); mono_debugger_unlock (); return NULL; } mono_debugger_unlock (); return symfile; }