From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 17385 invoked by alias); 16 Sep 2002 04:42:59 -0000 Mailing-List: contact gdb-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-owner@sources.redhat.com Received: (qmail 17378 invoked from network); 16 Sep 2002 04:42:58 -0000 Received: from unknown (HELO msgbas1.cos.agilent.com) (192.25.240.36) by sources.redhat.com with SMTP; 16 Sep 2002 04:42:58 -0000 Received: from relcos2.cos.agilent.com (relcos2.cos.agilent.com [130.29.152.237]) by msgbas1.cos.agilent.com (Postfix) with ESMTP id 26BC4B62B; Sun, 15 Sep 2002 22:42:58 -0600 (MDT) Received: from websvr.canada.agilent.com (websvr.canada.agilent.com [141.184.122.102]) by relcos2.cos.agilent.com (Postfix) with ESMTP id 2F1C245C; Sun, 15 Sep 2002 22:42:11 -0600 (MDT) Received: from agilent.com (cos1nai130044.cos.agilent.com [141.184.130.44]) by websvr.canada.agilent.com (8.9.3 (PHNE_25183)/8.9.3 SMKit7.1.1_Agilent) with ESMTP id VAA03163; Sun, 15 Sep 2002 21:42:53 -0700 (PDT) Message-ID: <3D85614B.8010701@agilent.com> Date: Sun, 15 Sep 2002 21:42:00 -0000 From: Earl Chew Organization: Agilent Technologies User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.0.1) Gecko/20020823 Netscape/7.0 X-Accept-Language: en-us, en MIME-Version: 1.0 To: "H. J. Lu" Cc: gdb@sources.redhat.com, drow@mvista.com, jimb@redhat.com Subject: Re: Mystified by "Internal error: pc 0x89f21e10 read in psymtab, but not in symtab References: <3D825BB5.48CFAFAB@agilent.com> <20020913220110.GA22097@nevyn.them.org> <3D8269C8.8E33C4AC@agilent.com> <20020913225151.GA24869@nevyn.them.org> <3D8270FF.3086EA5C@agilent.com> <20020914013314.GB31038@nevyn.them.org> <3D84AAAD.6090706@agilent.com> <20020915160306.GA31994@nevyn.them.org> <20020915133938.B19112@lucon.org> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-SW-Source: 2002-09/txt/msg00195.txt.bz2 H. J. Lu wrote: > That patch is broken. See > > http://sources.redhat.com/ml/gdb/2002-03/msg00197.html > http://sources.redhat.com/ml/gdb/2002-03/msg00202.html > > Unfortunately, no one seems to care. I care, I care! How eerie. I wrote a set of changes this morning, and now comparing with your changes --- it's uncanny how close they are. I enclose my patches below for you to peruse. I have some questions regarding some minor differences: a. I figured it was better in general to invoke the relocation function pointer with the section offset structure, and let each implementation figure out what relocations are required. I thought that some implementations (in the future) might cache things other than text locations (eg data locations). b. In dbxread.c, I initialise the relocate_symtab pointer in start_psymtab _and_ end_psymtab (where the code loops and allocates new psymtabs and copies values across). Your patch doesn't initialise the function pointer here, and I believe that this will result in an uninitialised field. Earl -- --- ../../gdb-5.2.1-orig/gdb/dbxread.c 2002-04-04 13:33:50.000000000 -0800 +++ dbxread.c 2002-09-15 08:52:53.000000000 -0700 @@ -277,6 +277,9 @@ static void read_ofile_symtab (struct partial_symtab *); +static void dbx_relocate_psymtab (struct partial_symtab *, + struct section_offsets *delta); + static void dbx_psymtab_to_symtab (struct partial_symtab *); static void dbx_psymtab_to_symtab_1 (struct partial_symtab *); @@ -2193,6 +2196,7 @@ TEXTHIGH (result) = result->texthigh; LDSYMOFF (result) = ldsymoff; result->read_symtab = dbx_psymtab_to_symtab; + result->relocate_symtab = dbx_relocate_psymtab; SYMBOL_SIZE (result) = symbol_size; SYMBOL_OFFSET (result) = symbol_table_offset; STRING_OFFSET (result) = string_table_offset; @@ -2351,6 +2355,7 @@ subpst->readin = 0; subpst->symtab = 0; subpst->read_symtab = pst->read_symtab; + subpst->relocate_symtab = pst->relocate_symtab; } sort_pst_symbols (pst); @@ -2436,6 +2441,15 @@ pst->readin = 1; } +/* Relocate the cached text offsets for this psymtab. */ + +static void +dbx_relocate_psymtab (struct partial_symtab *pst, struct section_offsets *delta) +{ + TEXTLOW (pst) += ANOFFSET (delta, SECT_OFF_TEXT (pst->objfile)); + TEXTHIGH (pst) += ANOFFSET (delta, SECT_OFF_TEXT (pst->objfile)); +} + /* Read in all of the symbols for a given psymtab for real. Be verbose about it if the user wants that. */ --- ../../gdb-5.2.1-orig/gdb/objfiles.c 2001-12-06 11:59:12.000000000 -0800 +++ objfiles.c 2002-09-15 09:01:35.000000000 -0700 @@ -603,6 +603,9 @@ { p->textlow += ANOFFSET (delta, SECT_OFF_TEXT (objfile)); p->texthigh += ANOFFSET (delta, SECT_OFF_TEXT (objfile)); + + if (p->relocate_symtab) + (*p->relocate_symtab) (p, delta); } } --- ../../gdb-5.2.1-orig/gdb/symfile.c 2002-06-22 09:49:34.000000000 -0700 +++ symfile.c 2002-09-15 21:28:55.000000000 -0700 @@ -2338,6 +2338,7 @@ psymtab->section_offsets = section_offsets; psymtab->textlow = textlow; psymtab->texthigh = psymtab->textlow; /* default */ + psymtab->relocate_symtab = 0; psymtab->globals_offset = global_syms - objfile->global_psymbols.list; psymtab->statics_offset = static_syms - objfile->static_psymbols.list; return (psymtab); --- ../../gdb-5.2.1-orig/gdb/symtab.h 2002-06-28 15:05:48.000000000 -0700 +++ symtab.h 2002-09-15 09:00:32.000000000 -0700 @@ -1029,6 +1029,11 @@ void (*read_symtab) (struct partial_symtab *); + /* Pointer to function which will relocate the symtab corresponding to + this psymtab. May be 0 if no relocations are required. */ + + void (*relocate_symtab) (struct partial_symtab *, struct section_offsets *); + /* Information that lets read_symtab() locate the part of the symbol table that this psymtab corresponds to. This information is private to the format-dependent symbol reading routines. For further detail examine