This is the mail archive of the
gdb@sources.redhat.com
mailing list for the GDB project.
Problem with 2000-05-05 elfread.c change
- To: gdb at sourceware dot cygnus dot com
- Subject: Problem with 2000-05-05 elfread.c change
- From: "Peter.Schauer" <Peter dot Schauer at regent dot e-technik dot tu-muenchen dot de>
- Date: Mon, 2 Oct 2000 19:04:39 MET DST
- Cc: ezannoni at cygnus dot com
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