From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9735 invoked by alias); 12 Nov 2007 15:37:38 -0000 Received: (qmail 9717 invoked by uid 22791); 12 Nov 2007 15:37:36 -0000 X-Spam-Check-By: sourceware.org Received: from mtagate1.de.ibm.com (HELO mtagate1.de.ibm.com) (195.212.29.150) by sourceware.org (qpsmtpd/0.31) with ESMTP; Mon, 12 Nov 2007 15:37:33 +0000 Received: from d12nrmr1607.megacenter.de.ibm.com (d12nrmr1607.megacenter.de.ibm.com [9.149.167.49]) by mtagate1.de.ibm.com (8.13.8/8.13.8) with ESMTP id lACFbUBF037016; Mon, 12 Nov 2007 15:37:30 GMT Received: from d12av02.megacenter.de.ibm.com (d12av02.megacenter.de.ibm.com [9.149.165.228]) by d12nrmr1607.megacenter.de.ibm.com (8.13.8/8.13.8/NCO v8.6) with ESMTP id lACFbUoA2306130; Mon, 12 Nov 2007 16:37:30 +0100 Received: from d12av02.megacenter.de.ibm.com (loopback [127.0.0.1]) by d12av02.megacenter.de.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id lACFbTAp017008; Mon, 12 Nov 2007 16:37:29 +0100 Received: from tuxmaker.boeblingen.de.ibm.com (tuxmaker.boeblingen.de.ibm.com [9.152.85.9]) by d12av02.megacenter.de.ibm.com (8.12.11.20060308/8.12.11) with SMTP id lACFbTkm017005; Mon, 12 Nov 2007 16:37:29 +0100 Message-Id: <200711121537.lACFbTkm017005@d12av02.megacenter.de.ibm.com> Received: by tuxmaker.boeblingen.de.ibm.com (sSMTP sendmail emulation); Mon, 12 Nov 2007 16:37:29 +0100 Subject: [rfc, v3] Fix ELF synthetic symbol size bug (affects PPC64) To: amodra@bigpond.net.au (Alan Modra), binutils@sourceware.org, gdb-patches@sourceware.org Date: Mon, 12 Nov 2007 15:37:00 -0000 From: "Ulrich Weigand" Cc: drow@false.org In-Reply-To: <20071112032907.GF13318@bubble.grove.modra.org> from "Alan Modra" at Nov 12, 2007 01:59:07 PM X-Mailer: ELM [version 2.5 PL2] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Mailing-List: contact binutils-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: binutils-owner@sourceware.org X-SW-Source: 2007-11/txt/msg00118.txt.bz2 Alan Modra wrote: > On Tue, Nov 06, 2007 at 04:44:02PM -0500, Daniel Jacobowitz wrote: > > > Is the bfd part OK? > > > > The elf.c part of this does not make sense to me. Why should we have > > the same size as that symbol? The @plt entry is only a couple of > > instructions. To figure out its size you need to ask the backend > > plt_sym_val routine. > > Agreed. The ppc64 part is OK. I'm committing the following to fix > a bug I noticed in the elf.c get_synthetic_symtab function. I also > set udata.p to NULL as this may be all that's needed with a modified > version of Ulrich's patch. Thanks, Alan. The following version of the patch has only the ppc64 binutils part, and uses the udata.p setting in GDB only if it is not NULL. This fixes the ppc64 problem as well (and has no regressions on ppc32 either). This still will not give us size information for PLT stubs, but I guess that could still be added at some later time ... Any additional comments on this approach? Thanks, Ulrich bfd/ChangeLog: * elf64-ppc.c (ppc64_elf_get_synthetic_symtab): Set udata.p of synthetic symbol to point to the ELF symbol it was derived from. gdb/ChangeLog: * elfread.c (ST_REGULAR, ST_DYNAMIC, ST_SYNTHETIC): New defines. (elf_symtab_read): Rename DYNAMIC argument to TYPE. Do not access ELF-private symbol data when processing synthetic symbols. Use udata.p to get at the size of ppc64 synthetic 'dot' symbols. (elf_symfile_read): Pass TYPE argument to elf_symtab_read. diff -urNp gdb-orig/bfd/elf64-ppc.c gdb-head/bfd/elf64-ppc.c --- gdb-orig/bfd/elf64-ppc.c 2007-11-12 14:58:24.116239234 +0100 +++ gdb-head/bfd/elf64-ppc.c 2007-11-12 14:54:46.277454025 +0100 @@ -2959,6 +2959,9 @@ ppc64_elf_get_synthetic_symtab (bfd *abf len = strlen (syms[i]->name); memcpy (names, syms[i]->name, len + 1); names += len + 1; + /* Have udata.p point back to the original symbol this + synthetic symbol was derived from. */ + s->udata.p = syms[i]; s++; } } @@ -3046,6 +3049,9 @@ ppc64_elf_get_synthetic_symtab (bfd *abf len = strlen (syms[i]->name); memcpy (names, syms[i]->name, len + 1); names += len + 1; + /* Have udata.p point back to the original symbol this + synthetic symbol was derived from. */ + s->udata.p = syms[i]; s++; } } diff -urNp gdb-orig/gdb/elfread.c gdb-head/gdb/elfread.c --- gdb-orig/gdb/elfread.c 2007-11-12 14:58:24.126237797 +0100 +++ gdb-head/gdb/elfread.c 2007-11-12 14:56:11.781191611 +0100 @@ -180,14 +180,14 @@ record_minimal_symbol (char *name, CORE_ SYNOPSIS - void elf_symtab_read (struct objfile *objfile, int dynamic, + void elf_symtab_read (struct objfile *objfile, int type, long number_of_symbols, asymbol **symbol_table) DESCRIPTION Given an objfile, a symbol table, and a flag indicating whether the - symbol table contains dynamic symbols, add all the global function - and data symbols to the minimal symbol table. + symbol table contains regular, dynamic, or synthetic symbols, add all + the global function and data symbols to the minimal symbol table. In stabs-in-ELF, as implemented by Sun, there are some local symbols defined in the ELF symbol table, which can be used to locate @@ -197,8 +197,12 @@ record_minimal_symbol (char *name, CORE_ */ +#define ST_REGULAR 0 +#define ST_DYNAMIC 1 +#define ST_SYNTHETIC 2 + static void -elf_symtab_read (struct objfile *objfile, int dynamic, +elf_symtab_read (struct objfile *objfile, int type, long number_of_symbols, asymbol **symbol_table) { long storage_needed; @@ -235,7 +239,7 @@ elf_symtab_read (struct objfile *objfile continue; offset = ANOFFSET (objfile->section_offsets, sym->section->index); - if (dynamic + if (type == ST_DYNAMIC && sym->section == &bfd_und_section && (sym->flags & BSF_FUNCTION)) { @@ -284,7 +288,7 @@ elf_symtab_read (struct objfile *objfile /* If it is a nonstripped executable, do not enter dynamic symbols, as the dynamic symbol table is usually a subset of the main symbol table. */ - if (dynamic && !stripped) + if (type == ST_DYNAMIC && !stripped) continue; if (sym->flags & BSF_FILE) { @@ -324,8 +328,11 @@ elf_symtab_read (struct objfile *objfile { /* This is a hack to get the minimal symbol type right for Irix 5, which has absolute addresses - with special section indices for dynamic symbols. */ - unsigned short shndx = + with special section indices for dynamic symbols. + + NOTE: uweigand-20071112: Synthetic symbols do not + have an ELF-private part, so do not touch those. */ + unsigned short shndx = type == ST_SYNTHETIC ? 0 : ((elf_symbol_type *) sym)->internal_elf_sym.st_shndx; switch (shndx) @@ -484,11 +491,24 @@ elf_symtab_read (struct objfile *objfile msym = record_minimal_symbol ((char *) sym->name, symaddr, ms_type, sym->section, objfile); + if (msym) { /* Pass symbol size field in via BFD. FIXME!!! */ - unsigned long size = ((elf_symbol_type *) sym)->internal_elf_sym.st_size; - MSYMBOL_SIZE(msym) = size; + elf_symbol_type *elf_sym; + + /* NOTE: uweigand-20071112: A synthetic symbol does not have an + ELF-private part. However, in some cases (e.g. synthetic + 'dot' symbols on ppc64) the udata.p entry is set to point back + to the original ELF symbol it was derived from. Get the size + from that symbol. */ + if (type != ST_SYNTHETIC) + elf_sym = (elf_symbol_type *) sym; + else + elf_sym = (elf_symbol_type *) sym->udata.p; + + if (elf_sym) + MSYMBOL_SIZE(msym) = elf_sym->internal_elf_sym.st_size; } if (msym != NULL) msym->filename = filesymname; @@ -569,7 +589,7 @@ elf_symfile_read (struct objfile *objfil error (_("Can't read symbols from %s: %s"), bfd_get_filename (objfile->obfd), bfd_errmsg (bfd_get_error ())); - elf_symtab_read (objfile, 0, symcount, symbol_table); + elf_symtab_read (objfile, ST_REGULAR, symcount, symbol_table); } /* Add the dynamic symbols. */ @@ -587,7 +607,7 @@ elf_symfile_read (struct objfile *objfil error (_("Can't read symbols from %s: %s"), bfd_get_filename (objfile->obfd), bfd_errmsg (bfd_get_error ())); - elf_symtab_read (objfile, 1, dynsymcount, dyn_symbol_table); + elf_symtab_read (objfile, ST_DYNAMIC, dynsymcount, dyn_symbol_table); } /* Add synthetic symbols - for instance, names for any PLT entries. */ @@ -605,7 +625,7 @@ elf_symfile_read (struct objfile *objfil for (i = 0; i < synthcount; i++) synth_symbol_table[i] = synthsyms + i; make_cleanup (xfree, synth_symbol_table); - elf_symtab_read (objfile, 0, synthcount, synth_symbol_table); + elf_symtab_read (objfile, ST_SYNTHETIC, synthcount, synth_symbol_table); } /* Install any minimal symbols that have been collected as the current -- Dr. Ulrich Weigand GNU Toolchain for Linux on System z and Cell BE Ulrich.Weigand@de.ibm.com