This is the mail archive of the gdb@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: Problem with 2000-05-05 elfread.c change


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

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]