[RFA] rs6000-nat.c fix for large symtabs.
Chris Faylor
cgf@cygnus.com
Fri Apr 7 15:06:00 GMT 2000
On Fri, Apr 07, 2000 at 02:42:45PM -0700, glen mccready wrote:
>
>Some processes have more than 64 load segments; in the past gdb
>would fail under these circumstances. This patch should alleviate
>that problem by expanding the buffer if the ld_info won't fit.
Would it be feasible to do this with malloc/realloc instead of alloca in
this case? Otherwise you could be wasting a lot of stack space.
cgf
>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.
>
>Index: rs6000-nat.c
>===================================================================
>retrieving revision 2.41.60.1
>diff -c -b -r2.41.60.1 rs6000-nat.c
>*** rs6000-nat.c 2000/02/14 04:31:53 2.41.60.1
>--- rs6000-nat.c 2000/04/07 21:41:41
>***************
>*** 639,649 ****
> xcoff_relocate_symtab (pid)
> unsigned int pid;
> {
>! #define MAX_LOAD_SEGS 64 /* maximum number of load segments */
>
> struct ld_info *ldi;
>
>! ldi = (void *) alloca (MAX_LOAD_SEGS * sizeof (*ldi));
>
> /* According to my humble theory, AIX has some timing problems and
> when the user stack grows, kernel doesn't update stack info in time
>--- 639,654 ----
> xcoff_relocate_symtab (pid)
> unsigned int pid;
> {
>! int load_segs = 64; /* number of load segments */
>! int rc;
>
>+ do
>+ {
> struct ld_info *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,667 ****
> usleep (36000);
>
> errno = 0;
>! ptrace (PT_LDINFO, pid, (PTRACE_ARG3_TYPE) ldi,
>! MAX_LOAD_SEGS * sizeof (*ldi), (int *) ldi);
>! if (errno)
> perror_with_name ("ptrace ldinfo");
>!
> vmap_ldinfo (ldi);
>!
>! /* relocate the exec and core sections as well. */
>! vmap_exec ();
> }
>
> /* Core file stuff. */
>--- 658,678 ----
> usleep (36000);
>
> errno = 0;
>! 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);
>! vmap_exec (); /* relocate the exec and core sections as well. */
>! }
>! } while (rc == -1);
> }
>
> /* Core file stuff. */
--
cgf@cygnus.com Cygnus Solutions, a Red Hat company
http://sourcware.cygnus.com/ http://www.redhat.com/
More information about the Gdb-patches
mailing list