From 8b150a6b1808b58c73658293c0d226620e2eed87 Mon Sep 17 00:00:00 2001 From: Peter Schauer Date: Sun, 26 Apr 1998 14:59:48 +0000 Subject: [PATCH] * rs6000-nat.c (vmap_ldinfo): Issue warning instead of error if fstat on ldinfo_fd fails. Use objfile->obfd instead of vp->bfd to check for reference to the same file. * target.c (target_read_string): Handle string transfers at the end of a memory section gracefully. --- gdb/ChangeLog | 9 +++++++++ gdb/rs6000-nat.c | 35 +++++++++++++++++++++++------------ 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index f06db22..c8d00b7 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +Sun Apr 26 07:57:21 1998 Peter Schauer + + * rs6000-nat.c (vmap_ldinfo): Issue warning instead of error if + fstat on ldinfo_fd fails. Use objfile->obfd instead of vp->bfd + to check for reference to the same file. + + * target.c (target_read_string): Handle string transfers at the + end of a memory section gracefully. + Fri Apr 24 17:18:56 1998 Geoffrey Noer * Makefile.in: enable EXEEXT setting diff --git a/gdb/rs6000-nat.c b/gdb/rs6000-nat.c index b57054f..7e250ef 100644 --- a/gdb/rs6000-nat.c +++ b/gdb/rs6000-nat.c @@ -1,5 +1,5 @@ /* IBM RS/6000 native-dependent code for GDB, the GNU debugger. - Copyright 1986, 1987, 1989, 1991, 1992, 1994, 1995, 1996, 1997 + Copyright 1986, 1987, 1989, 1991, 1992, 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc. This file is part of GDB. @@ -466,15 +466,24 @@ vmap_ldinfo (ldi) retried = 0; if (fstat (ldi->ldinfo_fd, &ii) < 0) - fatal ("cannot fstat(fd=%d) on %s", ldi->ldinfo_fd, name); + { + /* The kernel sets ld_info to -1, if the process is still using the + object, and the object is removed. Keep the symbol info for the + removed object and issue a warning. */ + warning ("%s (fd=%d) has disappeared, keeping its symbols", + name, ldi->ldinfo_fd); + continue; + } retry: for (got_one = 0, vp = vmap; vp; vp = vp->nxt) { + struct objfile *objfile; + /* First try to find a `vp', which is the same as in ldinfo. If not the same, just continue and grep the next `vp'. If same, relocate its tstart, tend, dstart, dend values. If no such `vp' found, get out of this for loop, add this ldi entry as a new vmap - (add_vmap) and come back, fins its `vp' and so on... */ + (add_vmap) and come back, find its `vp' and so on... */ /* The filenames are not always sufficient to match on. */ @@ -482,15 +491,17 @@ vmap_ldinfo (ldi) || (memb[0] && !STREQ(memb, vp->member))) continue; - /* See if we are referring to the same file. */ - if (bfd_stat (vp->bfd, &vi) < 0) - /* An error here is innocuous, most likely meaning that - the file descriptor has become worthless. - FIXME: What does it mean for a file descriptor to become - "worthless"? What makes it happen? What error does it - produce (ENOENT? others?)? Should we at least provide - a warning? */ - continue; + /* See if we are referring to the same file. + We have to check objfile->obfd, symfile.c:reread_symbols might + have updated the obfd after a change. */ + objfile = vp->objfile == NULL ? symfile_objfile : vp->objfile; + if (objfile == NULL + || objfile->obfd == NULL + || bfd_stat (objfile->obfd, &vi) < 0) + { + warning ("Unable to stat %s, keeping its symbols", name); + continue; + } if (ii.st_dev != vi.st_dev || ii.st_ino != vi.st_ino) continue; -- 2.7.4