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]

Problem with 2000-05-05 elfread.c change


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]