diff options
Diffstat (limited to 'gdb/objfiles.c')
-rw-r--r-- | gdb/objfiles.c | 140 |
1 files changed, 104 insertions, 36 deletions
diff --git a/gdb/objfiles.c b/gdb/objfiles.c index 9842615..4443c5d 100644 --- a/gdb/objfiles.c +++ b/gdb/objfiles.c @@ -34,12 +34,23 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* Prototypes for local functions */ +#if !defined(NO_MMALLOC) && defined(HAVE_MMAP) + +static int +open_existing_mapped_file PARAMS ((char *, long, int)); + static int open_mapped_file PARAMS ((char *filename, long mtime, int mapped)); static CORE_ADDR map_to_address PARAMS ((void)); +#endif /* !defined(NO_MMALLOC) && defined(HAVE_MMAP) */ + +/* Message to be printed before the error message, when an error occurs. */ + +extern char *error_pre_print; + /* Externally visible variables that are owned by this module. See declarations in objfile.h for more info. */ @@ -359,6 +370,57 @@ have_minimal_symbols () return 0; } +#if !defined(NO_MMALLOC) && defined(HAVE_MMAP) + +/* Given the name of a mapped symbol file in SYMSFILENAME, and the timestamp + of the corresponding symbol file in MTIME, try to open an existing file + with the name SYMSFILENAME and verify it is more recent than the base + file by checking it's timestamp against MTIME. + + If SYMSFILENAME does not exist (or can't be stat'd), simply returns -1. + + If SYMSFILENAME does exist, but is out of date, we check to see if the + user has specified creation of a mapped file. If so, we don't issue + any warning message because we will be creating a new mapped file anyway, + overwriting the old one. If not, then we issue a warning message so that + the user will know why we aren't using this existing mapped symbol file. + In either case, we return -1. + + If SYMSFILENAME does exist and is not out of date, but can't be opened for + some reason, then prints an appropriate system error message and returns -1. + + Otherwise, returns the open file descriptor. */ + +static int +open_existing_mapped_file (symsfilename, mtime, mapped) + char *symsfilename; + long mtime; + int mapped; +{ + int fd = -1; + struct stat sbuf; + + if (stat (symsfilename, &sbuf) == 0) + { + if (sbuf.st_mtime < mtime) + { + if (!mapped) + { + warning ("mapped symbol file `%s' is out of date", symsfilename); + } + } + else if ((fd = open (symsfilename, O_RDWR)) < 0) + { + if (error_pre_print) + { + printf (error_pre_print); + } + print_sys_errmsg (symsfilename, errno); + } + } + return (fd); +} + /* Look for a mapped symbol file that corresponds to FILENAME and is more recent than MTIME. If MAPPED is nonzero, the user has asked that gdb use a mapped symbol file for this file, so create a new one if one does @@ -369,7 +431,19 @@ have_minimal_symbols () This routine is responsible for implementing the policy that generates the name of the mapped symbol file from the name of a file containing - symbols that gdb would like to read. */ + symbols that gdb would like to read. Currently this policy is to append + ".syms" to the name of the file. + + This routine is also responsible for implementing the policy that + determines where the mapped symbol file is found (the search path). + This policy is that when reading an existing mapped file, a file of + the correct name in the current directory takes precedence over a + file of the correct name in the same directory as the symbol file. + When creating a new mapped file, it is always created in the current + directory. This helps to minimize the chances of a user unknowingly + creating big mapped files in places like /bin and /usr/local/bin, and + allows a local copy to override a manually installed global copy (in + /bin for example). */ static int open_mapped_file (filename, mtime, mapped) @@ -378,53 +452,44 @@ open_mapped_file (filename, mtime, mapped) int mapped; { int fd; - char *symfilename; - struct stat sbuf; + char *symsfilename; - /* For now, all we do is look in the local directory for a file with - the name of the base file and an extension of ".syms" */ + /* First try to open an existing file in the current directory, and + then try the directory where the symbol file is located. */ - symfilename = concat ("./", basename (filename), ".syms", (char *) NULL); - - /* Check to see if the desired file already exists and is more recent than - the corresponding base file (specified by the passed MTIME parameter). - The open will fail if the file does not already exist. */ - - if ((fd = open (symfilename, O_RDWR)) >= 0) + symsfilename = concat ("./", basename (filename), ".syms", (char *) NULL); + if ((fd = open_existing_mapped_file (symsfilename, mtime, mapped)) < 0) { - if (fstat (fd, &sbuf) != 0) - { - (void) close (fd); - perror_with_name (symfilename); - } - else if (sbuf.st_mtime > mtime) - { - return (fd); - } - else - { - (void) close (fd); - fd = -1; - } + free (symsfilename); + symsfilename = concat (filename, ".syms", (char *) NULL); + fd = open_existing_mapped_file (symsfilename, mtime, mapped); } - /* Either the file does not already exist, or the base file has changed - since it was created. In either case, if the user has specified use of - a mapped file, then create a new mapped file, truncating any existing - one. - - In the case where there is an existing file, but it is out of date, and - the user did not specify mapped, the existing file is just silently - ignored. Perhaps we should warn about this case (FIXME?). + /* If we don't have an open file by now, then either the file does not + already exist, or the base file has changed since it was created. In + either case, if the user has specified use of a mapped file, then + create a new mapped file, truncating any existing one. If we can't + create one, print a system error message saying why we can't. By default the file is rw for everyone, with the user's umask taking care of turning off the permissions the user wants off. */ - if (mapped) + if ((fd < 0) && mapped) { - fd = open (symfilename, O_RDWR | O_CREAT | O_TRUNC, 0666); + free (symsfilename); + symsfilename = concat ("./", basename (filename), ".syms", + (char *) NULL); + if ((fd = open (symsfilename, O_RDWR | O_CREAT | O_TRUNC, 0666)) < 0) + { + if (error_pre_print) + { + printf (error_pre_print); + } + print_sys_errmsg (symsfilename, errno); + } } + free (symsfilename); return (fd); } @@ -472,3 +537,6 @@ map_to_address () #endif } + +#endif /* !defined(NO_MMALLOC) && defined(HAVE_MMAP) */ + |