public inbox for gdb@sourceware.org
 help / color / mirror / Atom feed
* Problem with 2000-05-05 elfread.c change
@ 2000-10-02 10:04 Peter.Schauer
  2000-10-02 19:01 ` Elena Zannoni
  0 siblings, 1 reply; 5+ messages in thread
From: Peter.Schauer @ 2000-10-02 10:04 UTC (permalink / raw)
  To: gdb; +Cc: ezannoni

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

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2000-10-04  4:00 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2000-10-02 10:04 Problem with 2000-05-05 elfread.c change Peter.Schauer
2000-10-02 19:01 ` Elena Zannoni
2000-10-03  5:06   ` Peter.Schauer
2000-10-03 18:44     ` Elena Zannoni
2000-10-04  4:00       ` CVS GDB and Register Numbers and Remote Protocol Steven Johnson

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).