aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGlen McCready <gkm@pobox.com>2000-04-20 23:54:45 +0000
committerGlen McCready <gkm@pobox.com>2000-04-20 23:54:45 +0000
commitc18e0d23bdc994d590c734601aec94c05f8d957f (patch)
tree886e4f8ee864e21c3c1ff1cff695aee417e072e4
parent49a5a3a3e37d495246ffe43f53a41b80e7892ec3 (diff)
downloadgdb-c18e0d23bdc994d590c734601aec94c05f8d957f.zip
gdb-c18e0d23bdc994d590c734601aec94c05f8d957f.tar.gz
gdb-c18e0d23bdc994d590c734601aec94c05f8d957f.tar.bz2
Fri Apr 7 13:44:38 2000 glen mccready <gkm@pobox.com>
* rs6000-nat.c (xcoff_relocate_symtab): Grow buffer if ptrace() fails due to lack of space.
-rw-r--r--gdb/ChangeLog5
-rw-r--r--gdb/rs6000-nat.c29
2 files changed, 25 insertions, 9 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 740a3ad..8d59e85 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,8 @@
+Fri Apr 7 13:44:38 2000 glen mccready <gkm@pobox.com>
+
+ * rs6000-nat.c (xcoff_relocate_symtab): Grow buffer if ptrace()
+ fails due to lack of space.
+
Fri Mar 24 12:10:38 2000 glen mccready <gkm@pobox.com>
* command.c, command.h (help_all): Add functionality to display
diff --git a/gdb/rs6000-nat.c b/gdb/rs6000-nat.c
index 63fadcf..f4b2831 100644
--- a/gdb/rs6000-nat.c
+++ b/gdb/rs6000-nat.c
@@ -639,11 +639,16 @@ void
xcoff_relocate_symtab (pid)
unsigned int pid;
{
-#define MAX_LOAD_SEGS 64 /* maximum number of load segments */
+ int load_segs = 64; /* number of load segments */
+ do
+ {
struct ld_info *ldi;
+ int rc;
- ldi = (void *) alloca (MAX_LOAD_SEGS * sizeof (*ldi));
+ ldi = (void *) alloca (load_segs * sizeof (*ldi));
+ if (ldi == 0)
+ perror_with_name ("xcoff_relocate_symtab");
/* According to my humble theory, AIX has some timing problems and
when the user stack grows, kernel doesn't update stack info in time
@@ -653,15 +658,21 @@ xcoff_relocate_symtab (pid)
usleep (36000);
errno = 0;
- ptrace (PT_LDINFO, pid, (PTRACE_ARG3_TYPE) ldi,
- MAX_LOAD_SEGS * sizeof (*ldi), (int *) ldi);
- if (errno)
+ rc = ptrace (PT_LDINFO, pid, (PTRACE_ARG3_TYPE) ldi,
+ load_segs * sizeof (*ldi), (int *) ldi);
+ if (rc == -1)
+ {
+ if (errno == ENOMEM)
+ load_segs *= 2;
+ else
perror_with_name ("ptrace ldinfo");
-
+ }
+ else
+ {
vmap_ldinfo (ldi);
-
- /* relocate the exec and core sections as well. */
- vmap_exec ();
+ vmap_exec (); /* relocate the exec and core sections as well. */
+ }
+ } while (rc == -1);
}
/* Core file stuff. */