diff options
Diffstat (limited to 'gdb/objfiles.c')
-rw-r--r-- | gdb/objfiles.c | 51 |
1 files changed, 48 insertions, 3 deletions
diff --git a/gdb/objfiles.c b/gdb/objfiles.c index 97b05dc..85f35cb 100644 --- a/gdb/objfiles.c +++ b/gdb/objfiles.c @@ -48,6 +48,9 @@ open_mapped_file PARAMS ((char *filename, long mtime, int mapped)); static CORE_ADDR map_to_address PARAMS ((void)); +static PTR +map_to_file PARAMS ((int)); + #endif /* !defined(NO_MMALLOC) && defined(HAVE_MMAP) */ /* Externally visible variables that are owned by this module. @@ -144,11 +147,9 @@ allocate_objfile (abfd, mapped) mapped); if (fd >= 0) { - CORE_ADDR mapto; PTR md; - if (((mapto = map_to_address ()) == 0) || - ((md = mmalloc_attach (fd, (PTR) mapto)) == NULL)) + if ((md = map_to_file (fd)) == NULL) { close (fd); } @@ -870,6 +871,50 @@ map_to_address () } +static PTR +map_to_file (fd) + int fd; +{ + PTR md; + CORE_ADDR mapto; + int tempfd; + + md = mmalloc_attach (fd, (PTR) 0); + if (md != NULL) + { + mapto = (CORE_ADDR) mmalloc_getkey (md, 1); + md = mmalloc_detach (md); + if (md != NULL) + { + /* FIXME: should figure out why detach failed */ + md = NULL; + } + else if (mapto != (CORE_ADDR) NULL) + { + /* This mapping file needs to be remapped at "mapto" */ + md = mmalloc_attach (fd, (PTR) mapto); + } + else + { + /* This is a freshly created mapping file. */ + mapto = (CORE_ADDR) mmalloc_findbase (20 * 1024 * 1024); + if (mapto != -1) + { + /* To avoid reusing the freshly created mapping file, at the + address selected by mmap, we must truncate it before trying + to do an attach at the address we want. */ + ftruncate (fd, 0); + md = mmalloc_attach (fd, (PTR) mapto); + if (md != NULL) + { + mmalloc_setkey (md, 1, (PTR) mapto); + } + } + } + } + return (md); +} + #endif /* !defined(NO_MMALLOC) && defined(HAVE_MMAP) */ /* Returns a section whose range includes PC or NULL if none found. */ |