This is the mail archive of the
gdb@sources.redhat.com
mailing list for the GDB project.
Re: Problem with 2000-05-05 elfread.c change
- To: "Peter.Schauer" <Peter dot Schauer at regent dot e-technik dot tu-muenchen dot de>
- Subject: Re: Problem with 2000-05-05 elfread.c change
- From: Elena Zannoni <ezannoni at cygnus dot com>
- Date: Mon, 2 Oct 2000 22:01:21 -0400 (EDT)
- Cc: gdb at sourceware dot cygnus dot com, ezannoni at cygnus dot com
- References: <200010021704.TAA02459@reisser.regent.e-technik.tu-muenchen.de>
Peter.Schauer writes:
I believe you. I was working on getting rid of that limit by
allocating stuff dynamically for the sections, but I didn't finish
it. Maybe I can find some time soon to finish it, but cannot guarantee
it. I'll see what I can do.
The change in elfread.c is however necessary to fix other problems.
Sorry.
Elena
> Problem with 2000-05-05 elfread.c change
>
> This change:
>
> 2000-05-05 Elena Zannoni <ezannoni@kwikemart.cygnus.com>
>
> * elfread.c (elf_symtab_read): The calculation of 'offset'
> must be done for each symbol, not just once. The index
> used must be the index of the section where 'sym' resides,
> not .text.
>
> causes subtle and difficult to track down problems with some gcc compiled C++
> executables.
> These executables have a very large number of .gnu.linkonce sections
> when using native ld on Solaris (I have not yet tried GNU ld, but GDB
> should work with executables generated with native ld).
> As an example, testsuite/gdb.c++/virtfunc contains 95 sections, our large
> C++ application 2750 sections.
>
> The large number of sections causes an indexing beyond the bounds of the
> offsets array in the ANOFFSET macro, which does no bounds checking.
> So intermittent garbage is obtained for the offset value, causing
> symbols to obtain the wrong address.
>
>
> I hope that you have access to a GNU Solaris toolchain using native ld.
>
> You should then be able to verify the problem by applying the ANOFFSET
> bounds checking kludge below (can't use SECT_OFF_MAX, because not all users
> of ANOFFSET include gdb-stabs.h).
>
> Run the resulting GDB on testsuite/gdb.c++/virtfunc and watch it die...
>
> *** ./symtab.h.orig Fri Sep 15 21:27:33 2000
> --- ./symtab.h Fri Sep 29 23:22:48 2000
> ***************
> *** 831,837 ****
>
> #define ANOFFSET(secoff, whichone) \
> ((whichone == -1) ? \
> ! (internal_error ("Section index is uninitialized"), -1) : secoff->offsets[whichone])
>
> /* The maximum possible size of a section_offsets table. */
>
> --- 831,840 ----
>
> #define ANOFFSET(secoff, whichone) \
> ((whichone == -1) ? \
> ! (internal_error ("Section index is uninitialized"), -1) : \
> ! ((whichone >= 40) ? \
> ! (internal_error ("Section index out of bounds"), -1) : \
> ! secoff->offsets[whichone]))
>
> /* The maximum possible size of a section_offsets table. */
>
> --
> Peter Schauer pes@regent.e-technik.tu-muenchen.de