X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=binutils%2Frddbg.c;h=27abd66a489bf653ed1cf1aeabb43053eae4594a;hb=752937aa0c1fd7a314d13731f999e895b2560b68;hp=b2602af4c6e98dd30e8a08367d77da47deb3d24c;hpb=f32fb3fd1fb24d8d72ba1abe43ec8cfd0cf4a89d;p=deliverable%2Fbinutils-gdb.git diff --git a/binutils/rddbg.c b/binutils/rddbg.c index b2602af4c6..27abd66a48 100644 --- a/binutils/rddbg.c +++ b/binutils/rddbg.c @@ -1,12 +1,13 @@ /* rddbg.c -- Read debugging information into a generic form. - Copyright (C) 1995, 1996 Free Software Foundation, Inc. + Copyright 1995, 1996, 1997, 2000, 2002, 2003, 2005, 2007, 2008, + 2010 Free Software Foundation, Inc. Written by Ian Lance Taylor . This file is part of GNU Binutils. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -16,39 +17,38 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ + /* This file reads debugging information into a generic form. This file knows how to dig the debugging information out of an object file. */ +#include "sysdep.h" #include "bfd.h" -#include "bucomm.h" #include "libiberty.h" +#include "bucomm.h" #include "debug.h" #include "budbg.h" -static boolean read_section_stabs_debugging_info - PARAMS ((bfd *, asymbol **, long, PTR, boolean *)); -static boolean read_symbol_stabs_debugging_info - PARAMS ((bfd *, asymbol **, long, PTR, boolean *)); -static boolean read_ieee_debugging_info PARAMS ((bfd *, PTR, boolean *)); -static void save_stab PARAMS ((int, int, bfd_vma, const char *)); -static void stab_context PARAMS ((void)); -static void free_saved_stabs PARAMS ((void)); +static bfd_boolean read_section_stabs_debugging_info + (bfd *, asymbol **, long, void *, bfd_boolean *); +static bfd_boolean read_symbol_stabs_debugging_info + (bfd *, asymbol **, long, void *, bfd_boolean *); +static bfd_boolean read_ieee_debugging_info (bfd *, void *, bfd_boolean *); +static void save_stab (int, int, bfd_vma, const char *); +static void stab_context (void); +static void free_saved_stabs (void); /* Read debugging information from a BFD. Returns a generic debugging pointer. */ -PTR -read_debugging_info (abfd, syms, symcount) - bfd *abfd; - asymbol **syms; - long symcount; +void * +read_debugging_info (bfd *abfd, asymbol **syms, long symcount, bfd_boolean no_messages) { - PTR dhandle; - boolean found; + void *dhandle; + bfd_boolean found; dhandle = debug_init (); if (dhandle == NULL) @@ -79,13 +79,14 @@ read_debugging_info (abfd, syms, symcount) { if (! parse_coff (abfd, syms, symcount, dhandle)) return NULL; - found = true; + found = TRUE; } if (! found) { - fprintf (stderr, "%s: no recognized debugging information\n", - bfd_get_filename (abfd)); + if (! no_messages) + non_fatal (_("%s: no recognized debugging information"), + bfd_get_filename (abfd)); return NULL; } @@ -94,23 +95,25 @@ read_debugging_info (abfd, syms, symcount) /* Read stabs in sections debugging information from a BFD. */ -static boolean -read_section_stabs_debugging_info (abfd, syms, symcount, dhandle, pfound) - bfd *abfd; - asymbol **syms; - long symcount; - PTR dhandle; - boolean *pfound; +static bfd_boolean +read_section_stabs_debugging_info (bfd *abfd, asymbol **syms, long symcount, + void *dhandle, bfd_boolean *pfound) { static struct { const char *secname; const char *strsecname; - } names[] = { { ".stab", ".stabstr" } }; + } + names[] = + { + { ".stab", ".stabstr" }, + { "LC_SYMTAB.stabs", "LC_SYMTAB.stabstr" }, + { "$GDB_SYMBOLS$", "$GDB_STRINGS$" } + }; unsigned int i; - PTR shandle; + void *shandle; - *pfound = false; + *pfound = FALSE; shandle = NULL; for (i = 0; i < sizeof names / sizeof names[0]; i++) @@ -133,7 +136,7 @@ read_section_stabs_debugging_info (abfd, syms, symcount, dhandle, pfound) fprintf (stderr, "%s: %s: %s\n", bfd_get_filename (abfd), names[i].secname, bfd_errmsg (bfd_get_error ())); - return false; + return FALSE; } strsize = bfd_section_size (abfd, strsec); @@ -143,25 +146,25 @@ read_section_stabs_debugging_info (abfd, syms, symcount, dhandle, pfound) fprintf (stderr, "%s: %s: %s\n", bfd_get_filename (abfd), names[i].strsecname, bfd_errmsg (bfd_get_error ())); - return false; + return FALSE; } if (shandle == NULL) { - shandle = start_stab (dhandle, abfd, true, syms, symcount); + shandle = start_stab (dhandle, abfd, TRUE, syms, symcount); if (shandle == NULL) - return false; + return FALSE; } - *pfound = true; + *pfound = TRUE; stroff = 0; next_stroff = 0; for (stab = stabs; stab < stabs + stabsize; stab += 12) { - bfd_size_type strx; + unsigned int strx; int type; - int other; + int other ATTRIBUTE_UNUSED; int desc; bfd_vma value; @@ -176,7 +179,7 @@ read_section_stabs_debugging_info (abfd, syms, symcount, dhandle, pfound) if (type == 0) { /* Special type 0 stabs indicate the offset to the - next string table. */ + next string table. */ stroff = next_stroff; next_stroff += value; } @@ -185,17 +188,36 @@ read_section_stabs_debugging_info (abfd, syms, symcount, dhandle, pfound) char *f, *s; f = NULL; + + if (stroff + strx > strsize) + { + fprintf (stderr, "%s: %s: stab entry %ld is corrupt, strx = 0x%x, type = %d\n", + bfd_get_filename (abfd), names[i].secname, + (long) (stab - stabs) / 12, strx, type); + continue; + } + s = (char *) strings + stroff + strx; + while (s[strlen (s) - 1] == '\\' && stab + 12 < stabs + stabsize) { + char *p; + stab += 12; - s[strlen (s) - 1] = '\0'; + p = s + strlen (s) - 1; + *p = '\0'; s = concat (s, ((char *) strings + stroff + bfd_get_32 (abfd, stab)), (const char *) NULL); + + /* We have to restore the backslash, because, if + the linker is hashing stabs strings, we may + see the same string more than once. */ + *p = '\\'; + if (f != NULL) free (f); f = s; @@ -207,12 +229,12 @@ read_section_stabs_debugging_info (abfd, syms, symcount, dhandle, pfound) { stab_context (); free_saved_stabs (); - return false; + return FALSE; } /* Don't free f, since I think the stabs code - expects strings to hang around. This should be - straightened out. FIXME. */ + expects strings to hang around. This should be + straightened out. FIXME. */ } } @@ -220,31 +242,27 @@ read_section_stabs_debugging_info (abfd, syms, symcount, dhandle, pfound) free (stabs); /* Don't free strings, since I think the stabs code expects - the strings to hang around. This should be straightened - out. FIXME. */ + the strings to hang around. This should be straightened + out. FIXME. */ } } if (shandle != NULL) { if (! finish_stab (dhandle, shandle)) - return false; + return FALSE; } - return true; + return TRUE; } /* Read stabs in the symbol table. */ -static boolean -read_symbol_stabs_debugging_info (abfd, syms, symcount, dhandle, pfound) - bfd *abfd; - asymbol **syms; - long symcount; - PTR dhandle; - boolean *pfound; +static bfd_boolean +read_symbol_stabs_debugging_info (bfd *abfd, asymbol **syms, long symcount, + void *dhandle, bfd_boolean *pfound) { - PTR shandle; + void *shandle; asymbol **ps, **symend; shandle = NULL; @@ -262,14 +280,15 @@ read_symbol_stabs_debugging_info (abfd, syms, symcount, dhandle, pfound) if (shandle == NULL) { - shandle = start_stab (dhandle, abfd, false, syms, symcount); + shandle = start_stab (dhandle, abfd, FALSE, syms, symcount); if (shandle == NULL) - return false; + return FALSE; } - *pfound = true; + *pfound = TRUE; s = i.name; + f = NULL; while (s[strlen (s) - 1] == '\\' && ps + 1 < symend) { @@ -293,33 +312,30 @@ read_symbol_stabs_debugging_info (abfd, syms, symcount, dhandle, pfound) { stab_context (); free_saved_stabs (); - return false; + return FALSE; } - free_saved_stabs (); - /* Don't free f, since I think the stabs code expects strings to hang around. This should be straightened out. FIXME. */ } } + free_saved_stabs (); + if (shandle != NULL) { if (! finish_stab (dhandle, shandle)) - return false; + return FALSE; } - return true; + return TRUE; } /* Read IEEE debugging information. */ -static boolean -read_ieee_debugging_info (abfd, dhandle, pfound) - bfd *abfd; - PTR dhandle; - boolean *pfound; +static bfd_boolean +read_ieee_debugging_info (bfd *abfd, void *dhandle, bfd_boolean *pfound) { asection *dsec; bfd_size_type size; @@ -330,21 +346,21 @@ read_ieee_debugging_info (abfd, dhandle, pfound) dsec = bfd_get_section_by_name (abfd, ".debug"); if (dsec == NULL) - return true; + return TRUE; size = bfd_section_size (abfd, dsec); contents = (bfd_byte *) xmalloc (size); if (! bfd_get_section_contents (abfd, dsec, contents, 0, size)) - return false; + return FALSE; if (! parse_ieee (dhandle, abfd, contents, size)) - return false; + return FALSE; free (contents); - *pfound = true; + *pfound = TRUE; - return true; + return TRUE; } /* Record stabs strings, so that we can give some context for errors. */ @@ -365,11 +381,7 @@ static int saved_stabs_index; /* Save a stabs string. */ static void -save_stab (type, desc, value, string) - int type; - int desc; - bfd_vma value; - const char *string; +save_stab (int type, int desc, bfd_vma value, const char *string) { if (saved_stabs[saved_stabs_index].string != NULL) free (saved_stabs[saved_stabs_index].string); @@ -383,11 +395,11 @@ save_stab (type, desc, value, string) /* Provide context for an error. */ static void -stab_context () +stab_context (void) { int i; - fprintf (stderr, "Last stabs entries before error:\n"); + fprintf (stderr, _("Last stabs entries before error:\n")); fprintf (stderr, "n_type n_desc n_value string\n"); i = saved_stabs_index; @@ -421,12 +433,18 @@ stab_context () /* Free the saved stab strings. */ static void -free_saved_stabs () +free_saved_stabs (void) { int i; for (i = 0; i < SAVE_STABS_COUNT; i++) - if (saved_stabs[i].string != NULL) - free (saved_stabs[i].string); + { + if (saved_stabs[i].string != NULL) + { + free (saved_stabs[i].string); + saved_stabs[i].string = NULL; + } + } + saved_stabs_index = 0; }