From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 18053 invoked by alias); 10 Nov 2004 21:28:59 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 17861 invoked from network); 10 Nov 2004 21:28:47 -0000 Received: from unknown (HELO walton.sibelius.xs4all.nl) (82.92.89.47) by sourceware.org with SMTP; 10 Nov 2004 21:28:47 -0000 Received: from elgar.sibelius.xs4all.nl (elgar.sibelius.xs4all.nl [192.168.0.2]) by walton.sibelius.xs4all.nl (8.13.0/8.13.0) with ESMTP id iAALSkse024946 for ; Wed, 10 Nov 2004 22:28:46 +0100 (CET) Received: from elgar.sibelius.xs4all.nl (localhost [127.0.0.1]) by elgar.sibelius.xs4all.nl (8.12.6p3/8.12.6) with ESMTP id iAALSket095541 for ; Wed, 10 Nov 2004 22:28:46 +0100 (CET) (envelope-from kettenis@elgar.sibelius.xs4all.nl) Received: (from kettenis@localhost) by elgar.sibelius.xs4all.nl (8.12.6p3/8.12.6/Submit) id iAALSkNM095538; Wed, 10 Nov 2004 22:28:46 +0100 (CET) Date: Wed, 10 Nov 2004 21:28:00 -0000 Message-Id: <200411102128.iAALSkNM095538@elgar.sibelius.xs4all.nl> From: Mark Kettenis To: gdb-patches@sources.redhat.com Subject: [RFC/RFA] Deal with intermixed 32-bit and 64-bit DWARF sections X-SW-Source: 2004-11/txt/msg00214.txt.bz2 Currently GDB crashes hard when we encounter both 32-bit anbd 64-bit DWARF sections within the same compilation unit. Keeping the mantra "Be liberal what you accept, but complain loudly", this patch fixes that. Mark Index: ChangeLog from Mark Kettenis * dwarf2read.c (dwarf2_build_psymtabs_easy): Initailize initial length size of compilation header to zero. (dwarf2_build_psymtabs_hard): Adjust info_ptr before building psymtabs for included files. (create_all_comp_units): Initailize initial length size of compilation header to zero. (read_initial_length): Complain if both 32-bit and 64-bit DWARF sections are encountered within the same compilation header. (dwarf_decode_line_header): Pass compilation header in call to read_initial_length. Index: dwarf2read.c =================================================================== RCS file: /cvs/src/src/gdb/dwarf2read.c,v retrieving revision 1.169 diff -u -p -r1.169 dwarf2read.c --- dwarf2read.c 10 Nov 2004 20:40:33 -0000 1.169 +++ dwarf2read.c 10 Nov 2004 21:19:41 -0000 @@ -1243,6 +1243,7 @@ dwarf2_build_psymtabs_easy (struct objfi struct comp_unit_head cu_header; int bytes_read; + cu_header.initial_length_size = 0; entry_length = read_initial_length (abfd, pubnames_ptr, &cu_header, &bytes_read); pubnames_ptr += bytes_read; @@ -1269,6 +1270,7 @@ read_comp_unit_head (struct comp_unit_he { int signed_addr; int bytes_read; + cu_header->length = read_initial_length (abfd, info_ptr, cu_header, &bytes_read); info_ptr += bytes_read; @@ -1533,6 +1535,9 @@ dwarf2_build_psymtabs_hard (struct objfi also happen.) This happens in VxWorks. */ free_named_symtabs (pst->filename); + info_ptr = beg_of_comp_unit + cu.header.length + + cu.header.initial_length_size; + if (comp_unit_die.has_stmt_list) { /* Get the list of files included in the current compilation unit, @@ -1540,9 +1545,6 @@ dwarf2_build_psymtabs_hard (struct objfi dwarf2_build_include_psymtabs (&cu, &comp_unit_die, pst); } - info_ptr = beg_of_comp_unit + cu.header.length - + cu.header.initial_length_size; - do_cleanups (back_to_inner); } do_cleanups (back_to); @@ -1632,6 +1634,7 @@ create_all_comp_units (struct objfile *o /* Read just enough information to find out where the next compilation unit is. */ + cu_header.initial_length_size = 0; cu_header.length = read_initial_length (objfile->obfd, info_ptr, &cu_header, &bytes_read); @@ -5850,7 +5853,7 @@ read_address (bfd *abfd, char *buf, stru As a side effect, this function sets the fields initial_length_size and offset_size in cu_header to the values appropriate for the length field. (The format of the initial length field determines - the width of file offsets to be fetched later with fetch_offset().) + the width of file offsets to be fetched later with read_offset().) [ Note: read_initial_length() and read_offset() are based on the document entitled "DWARF Debugging Information Format", revision @@ -5872,43 +5875,41 @@ static LONGEST read_initial_length (bfd *abfd, char *buf, struct comp_unit_head *cu_header, int *bytes_read) { - LONGEST retval = 0; - - retval = bfd_get_32 (abfd, (bfd_byte *) buf); + LONGEST length = bfd_get_32 (abfd, (bfd_byte *) buf); - if (retval == 0xffffffff) + if (length == 0xffffffff) { - retval = bfd_get_64 (abfd, (bfd_byte *) buf + 4); + length = bfd_get_64 (abfd, (bfd_byte *) buf + 4); *bytes_read = 12; - if (cu_header != NULL) - { - cu_header->initial_length_size = 12; - cu_header->offset_size = 8; - } } - else if (retval == 0) + else if (length == 0) { - /* Handle (non-standard) 64-bit DWARF2 formats such as that used - by IRIX. */ - retval = bfd_get_64 (abfd, (bfd_byte *) buf); + /* Handle the (non-standard) 64-bit DWARF2 format used by IRIX. */ + length = bfd_get_64 (abfd, (bfd_byte *) buf); *bytes_read = 8; - if (cu_header != NULL) - { - cu_header->initial_length_size = 8; - cu_header->offset_size = 8; - } } else { *bytes_read = 4; - if (cu_header != NULL) - { - cu_header->initial_length_size = 4; - cu_header->offset_size = 4; - } } - return retval; + if (cu_header) + { + gdb_assert (cu_header->initial_length_size == 0 + || cu_header->initial_length_size == 4 + || cu_header->initial_length_size == 8 + || cu_header->initial_length_size == 12); + + if (cu_header->initial_length_size != 0 + && cu_header->initial_length_size != *bytes_read) + complaint (&symfile_complaints, + "intermixed 32-bit and 64-bit DWARF sections"); + + cu_header->initial_length_size = *bytes_read; + cu_header->offset_size = (*bytes_read == 4) ? 4 : 8; + } + + return length; } /* Read an offset from the data stream. The size of the offset is @@ -6286,7 +6287,8 @@ dwarf_decode_line_header (unsigned int o line_ptr = dwarf2_per_objfile->line_buffer + offset; /* Read in the header. */ - lh->total_length = read_initial_length (abfd, line_ptr, NULL, &bytes_read); + lh->total_length = + read_initial_length (abfd, line_ptr, &cu->header, &bytes_read); line_ptr += bytes_read; if (line_ptr + lh->total_length > (dwarf2_per_objfile->line_buffer + dwarf2_per_objfile->line_size))