From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 28525 invoked by alias); 21 Jul 2004 20:46:07 -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 28510 invoked from network); 21 Jul 2004 20:46:04 -0000 Received: from unknown (HELO takamaka.act-europe.fr) (142.179.108.108) by sourceware.org with SMTP; 21 Jul 2004 20:46:04 -0000 Received: by takamaka.act-europe.fr (Postfix, from userid 507) id 328C947D91; Wed, 21 Jul 2004 13:46:04 -0700 (PDT) Date: Wed, 21 Jul 2004 20:46:00 -0000 From: Joel Brobecker To: binutils@sources.redhat.com Cc: gdb-patches@sources.redhat.com Subject: [RFA] MIPS_TEXT symbols should be associated to .text section? Message-ID: <20040721204604.GN1278@gnat.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="L6iaP+gRLNZHKoI4" Content-Disposition: inline User-Agent: Mutt/1.4i X-SW-Source: 2004-07/txt/msg00288.txt.bz2 --L6iaP+gRLNZHKoI4 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-length: 2300 Hello, I was looking at a fairly high number of regressions in the GDB testsuite on mips-irix, and one of them was caused by the fact that we searched a symbol by its address and that we match the possible candidates against the expected section. For instance, consider the following symbol "main" from my executable. nm on this symbol says: [76] | 268441176| 252|FUNC |GLOB |DEFAULT |MIPS_TEXT|main GDB is searching the symbol table for a symbol stored at 0x10001658 (268441176 = 0x10001658). The first thing it does is going through all the sections of the executable, and determine that there is only one section that contains this address: .text. So it figures that if a symbol matches this address, it will belong to that section. After that, it scans all symbols by address, and only find one symbol, the symbol above. But unfortunately, because the st_shndx is a bit special (SHN_MIPS_TEXT = 0xff01), it doesn't point to the .text section directly. So when bfd was used to read the symbol table, it defaulted the section of this symbol to an imaginary *ABS* section. And because of that, GDB discards my symbol because the section does not match. Objdump shows the same behavior: % objdump -T annota1 | grep main 10001658 g DF *ABS* 000000fc main Not knowing IRIX enough, I am not 110% sure that symbol main is indeed in section .text, but it seems pretty obvious: the address range of the section matches, .text is the only text section, the MIPS_TEXT shndx name... I read various man pages, but couldn't find anything that explicitly says MIPS_TEXT = .text section. So I made the following change, which allows us to recognize MIPS_TEXT. This fixes the symbol section to be .text, and as a consequence fixes the problem I've seen in GDB. Another evidence of the change is in the new output from the same objdump command: % objdump -T annota1 | grep main 10001658 g DF .text 000000fc main 2004-07-20 Joel Brobecker * elfxx-mips.c (_bfd_mips_elf_symbol_processing): Add handling for SHN_MIPS_TEXT symbols. Tested on mips-irix with no regressoin, by running the following testsuites: . binutils . libiberty . gas . ld . gdb OK to apply this patch? Thanks, -- Joel --L6iaP+gRLNZHKoI4 Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="elfxx-mips.c.diff" Content-length: 977 Index: elfxx-mips.c =================================================================== RCS file: /cvs/src/src/bfd/elfxx-mips.c,v retrieving revision 1.106 diff -u -p -r1.106 elfxx-mips.c --- elfxx-mips.c 1 Jul 2004 14:53:40 -0000 1.106 +++ elfxx-mips.c 21 Jul 2004 20:24:08 -0000 @@ -4192,6 +4192,20 @@ _bfd_mips_elf_symbol_processing (bfd *ab asym->section = bfd_und_section_ptr; break; + case SHN_MIPS_TEXT: + { + asection *section = bfd_get_section_by_name (abfd, ".text"); + if (section != NULL) + { + asym->section = section; + /* MIPS_TEXT is a bit special, the address is not an offset + to the base of the .text section. So substract the section + base address to make it an offset. */ + asym->value -= section->vma; + } + break; + } + #if 0 /* for SGI_COMPAT */ case SHN_MIPS_TEXT: asym->section = mips_elf_text_section_ptr; --L6iaP+gRLNZHKoI4--