This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch] relocating dwarf1 information


This patch copies the simple section relocation changes Dan for dwarf2 sometime back. I encountered a need to do this for dwarf1 debug information with a vxworks image. Bringing in bfd_simple_get_relocated_section_contents exposed bit rot on dwarf1.c's use of char pointers. I replaced a number of char * pointers by bfd_byte * pointers.

ok?

nathan
--
Nathan Sidwell    ::   http://www.codesourcery.com   ::         CodeSourcery

2008-02-11  Nathan Sidwell  <nathan@codesourcery.com>

	* dwarf1.c (struct dwarf1_debug): Add syms member.
	(alloc_dwarf1_unit, alloc_dwarf1_func): Check for out of memory.
	(parse_line_table, _bfd_dwarf1_find_nearest_line): Relocate
	section contents, check for out of memory.

	* dwarf1.c (struct dwarf1_debug): Change data pointers to bfd_byte.
	(parse_die): Change data pointers to bfd_byte.
	(parse_line_table, parse_functions_in_unit): Likewise.

Index: dwarf1.c
===================================================================
RCS file: /cvs/src/src/bfd/dwarf1.c,v
retrieving revision 1.18
diff -c -3 -p -r1.18 dwarf1.c
*** dwarf1.c	3 Jul 2007 14:26:40 -0000	1.18
--- dwarf1.c	12 Feb 2008 16:56:01 -0000
*************** struct dwarf1_debug
*** 35,58 ****
    /* The bfd we are working with.  */
    bfd* abfd;
  
    /* List of already parsed compilation units.  */
    struct dwarf1_unit* lastUnit;
  
    /* The buffer for the .debug section.
       Zero indicates that the .debug section failed to load.  */
!   char* debug_section;
  
    /* Pointer to the end of the .debug_info section memory buffer.  */
!   char* debug_section_end;
  
    /* The buffer for the .line section.  */
!   char* line_section;
  
    /* End of that buffer.  */
!   char* line_section_end;
  
    /* The current or next unread die within the .debug section.  */
!   char* currentDie;
  };
  
  /* One dwarf1_unit for each parsed compilation unit die.  */
--- 35,61 ----
    /* The bfd we are working with.  */
    bfd* abfd;
  
+   /* Pointer to the symbol table.  */
+   asymbol** syms;
+ 
    /* List of already parsed compilation units.  */
    struct dwarf1_unit* lastUnit;
  
    /* The buffer for the .debug section.
       Zero indicates that the .debug section failed to load.  */
!   bfd_byte *debug_section;
  
    /* Pointer to the end of the .debug_info section memory buffer.  */
!   bfd_byte *debug_section_end;
  
    /* The buffer for the .line section.  */
!   bfd_byte *line_section;
  
    /* End of that buffer.  */
!   bfd_byte *line_section_end;
  
    /* The current or next unread die within the .debug section.  */
!   bfd_byte *currentDie;
  };
  
  /* One dwarf1_unit for each parsed compilation unit die.  */
*************** struct dwarf1_unit
*** 63,69 ****
    struct dwarf1_unit* prev;
  
    /* Name of the compilation unit.  */
!   char* name;
  
    /* The highest and lowest address used in the compilation unit.  */
    unsigned long low_pc;
--- 66,72 ----
    struct dwarf1_unit* prev;
  
    /* Name of the compilation unit.  */
!   char *name;
  
    /* The highest and lowest address used in the compilation unit.  */
    unsigned long low_pc;
*************** struct dwarf1_unit
*** 76,82 ****
    unsigned long stmt_list_offset;
  
    /* If non-zero, a pointer to the first child of this unit.  */
!   char* first_child;
  
    /* How many line entries?  */
    unsigned long line_count;
--- 79,85 ----
    unsigned long stmt_list_offset;
  
    /* If non-zero, a pointer to the first child of this unit.  */
!   bfd_byte *first_child;
  
    /* How many line entries?  */
    unsigned long line_count;
*************** alloc_dwarf1_unit (struct dwarf1_debug* 
*** 141,148 ****
    bfd_size_type amt = sizeof (struct dwarf1_unit);
  
    struct dwarf1_unit* x = bfd_zalloc (stash->abfd, amt);
!   x->prev = stash->lastUnit;
!   stash->lastUnit = x;
  
    return x;
  }
--- 144,154 ----
    bfd_size_type amt = sizeof (struct dwarf1_unit);
  
    struct dwarf1_unit* x = bfd_zalloc (stash->abfd, amt);
!   if (x)
!     {
!       x->prev = stash->lastUnit;
!       stash->lastUnit = x;
!     }
  
    return x;
  }
*************** alloc_dwarf1_func (struct dwarf1_debug* 
*** 156,163 ****
    bfd_size_type amt = sizeof (struct dwarf1_func);
  
    struct dwarf1_func* x = bfd_zalloc (stash->abfd, amt);
!   x->prev = aUnit->func_list;
!   aUnit->func_list = x;
  
    return x;
  }
--- 162,172 ----
    bfd_size_type amt = sizeof (struct dwarf1_func);
  
    struct dwarf1_func* x = bfd_zalloc (stash->abfd, amt);
!   if (x)
!     {
!       x->prev = aUnit->func_list;
!       aUnit->func_list = x;
!     }
  
    return x;
  }
*************** alloc_dwarf1_func (struct dwarf1_debug* 
*** 172,182 ****
  static bfd_boolean
  parse_die (bfd *             abfd,
  	   struct die_info * aDieInfo,
! 	   char *            aDiePtr,
! 	   char *            aDiePtrEnd)
  {
!   char* this_die = aDiePtr;
!   char* xptr = this_die;
  
    memset (aDieInfo, 0, sizeof (* aDieInfo));
  
--- 181,191 ----
  static bfd_boolean
  parse_die (bfd *             abfd,
  	   struct die_info * aDieInfo,
! 	   bfd_byte *        aDiePtr,
! 	   bfd_byte *        aDiePtrEnd)
  {
!   bfd_byte *this_die = aDiePtr;
!   bfd_byte *xptr = this_die;
  
    memset (aDieInfo, 0, sizeof (* aDieInfo));
  
*************** parse_die (bfd *             abfd,
*** 242,249 ****
  	  break;
  	case FORM_STRING:
  	  if (attr == AT_name)
! 	    aDieInfo->name = xptr;
! 	  xptr += strlen (xptr) + 1;
  	  break;
  	}
      }
--- 251,258 ----
  	  break;
  	case FORM_STRING:
  	  if (attr == AT_name)
! 	    aDieInfo->name = (char *)xptr;
! 	  xptr += strlen (aDieInfo->name) + 1;
  	  break;
  	}
      }
*************** parse_die (bfd *             abfd,
*** 258,264 ****
  static bfd_boolean
  parse_line_table (struct dwarf1_debug* stash, struct dwarf1_unit* aUnit)
  {
!   char* xptr;
  
    /* Load the ".line" section from the bfd if we haven't already.  */
    if (stash->line_section == 0)
--- 267,273 ----
  static bfd_boolean
  parse_line_table (struct dwarf1_debug* stash, struct dwarf1_unit* aUnit)
  {
!   bfd_byte *xptr;
  
    /* Load the ".line" section from the bfd if we haven't already.  */
    if (stash->line_section == 0)
*************** parse_line_table (struct dwarf1_debug* s
*** 271,288 ****
  	return FALSE;
  
        size = msec->rawsize ? msec->rawsize : msec->size;
!       stash->line_section = bfd_alloc (stash->abfd, size);
  
        if (! stash->line_section)
  	return FALSE;
  
-       if (! bfd_get_section_contents (stash->abfd, msec, stash->line_section,
- 				      0, size))
- 	{
- 	  stash->line_section = 0;
- 	  return FALSE;
- 	}
- 
        stash->line_section_end = stash->line_section + size;
      }
  
--- 280,292 ----
  	return FALSE;
  
        size = msec->rawsize ? msec->rawsize : msec->size;
!       stash->line_section
! 	= bfd_simple_get_relocated_section_contents
! 	(stash->abfd, msec, NULL, stash->syms);
  
        if (! stash->line_section)
  	return FALSE;
  
        stash->line_section_end = stash->line_section + size;
      }
  
*************** parse_line_table (struct dwarf1_debug* s
*** 290,296 ****
    if (xptr < stash->line_section_end)
      {
        unsigned long eachLine;
!       char *tblend;
        unsigned long base;
        bfd_size_type amt;
  
--- 294,300 ----
    if (xptr < stash->line_section_end)
      {
        unsigned long eachLine;
!       bfd_byte *tblend;
        unsigned long base;
        bfd_size_type amt;
  
*************** parse_line_table (struct dwarf1_debug* s
*** 309,314 ****
--- 313,320 ----
        /* Allocate an array for the entries.  */
        amt = sizeof (struct linenumber) * aUnit->line_count;
        aUnit->linenumber_table = bfd_alloc (stash->abfd, amt);
+       if (!aUnit->linenumber_table)
+ 	return FALSE;
  
        for (eachLine = 0; eachLine < aUnit->line_count; eachLine++)
  	{
*************** parse_line_table (struct dwarf1_debug* s
*** 338,344 ****
  static bfd_boolean
  parse_functions_in_unit (struct dwarf1_debug* stash, struct dwarf1_unit* aUnit)
  {
!   char* eachDie;
  
    if (aUnit->first_child)
      for (eachDie = aUnit->first_child;
--- 344,350 ----
  static bfd_boolean
  parse_functions_in_unit (struct dwarf1_debug* stash, struct dwarf1_unit* aUnit)
  {
!   bfd_byte *eachDie;
  
    if (aUnit->first_child)
      for (eachDie = aUnit->first_child;
*************** parse_functions_in_unit (struct dwarf1_d
*** 357,362 ****
--- 363,370 ----
  	    || eachDieInfo.tag == TAG_entry_point)
  	  {
  	    struct dwarf1_func* aFunc = alloc_dwarf1_func (stash,aUnit);
+ 	    if (!aFunc)
+ 	      return FALSE;
  
  	    aFunc->name = eachDieInfo.name;
  	    aFunc->low_pc = eachDieInfo.low_pc;
*************** dwarf1_unit_find_nearest_line (struct dw
*** 442,448 ****
  bfd_boolean
  _bfd_dwarf1_find_nearest_line (bfd *abfd,
  			       asection *section,
! 			       asymbol **symbols ATTRIBUTE_UNUSED,
  			       bfd_vma offset,
  			       const char **filename_ptr,
  			       const char **functionname_ptr,
--- 450,456 ----
  bfd_boolean
  _bfd_dwarf1_find_nearest_line (bfd *abfd,
  			       asection *section,
! 			       asymbol **symbols,
  			       bfd_vma offset,
  			       const char **filename_ptr,
  			       const char **functionname_ptr,
*************** _bfd_dwarf1_find_nearest_line (bfd *abfd
*** 478,498 ****
  	return FALSE;
  
        size = msec->rawsize ? msec->rawsize : msec->size;
!       stash->debug_section = bfd_alloc (abfd, size);
  
        if (! stash->debug_section)
  	return FALSE;
  
-       if (! bfd_get_section_contents (abfd, msec, stash->debug_section,
- 				      0, size))
- 	{
- 	  stash->debug_section = 0;
- 	  return FALSE;
- 	}
- 
        stash->debug_section_end = stash->debug_section + size;
        stash->currentDie = stash->debug_section;
        stash->abfd = abfd;
      }
  
    /* A null debug_section indicates that there was no dwarf1 info
--- 486,502 ----
  	return FALSE;
  
        size = msec->rawsize ? msec->rawsize : msec->size;
!       stash->debug_section
! 	= bfd_simple_get_relocated_section_contents (abfd, msec, NULL,
! 						     symbols);
  
        if (! stash->debug_section)
  	return FALSE;
  
        stash->debug_section_end = stash->debug_section + size;
        stash->currentDie = stash->debug_section;
        stash->abfd = abfd;
+       stash->syms = symbols;
      }
  
    /* A null debug_section indicates that there was no dwarf1 info
*************** _bfd_dwarf1_find_nearest_line (bfd *abfd
*** 522,527 ****
--- 526,533 ----
  	{
  	  struct dwarf1_unit* aUnit
  	    = alloc_dwarf1_unit (stash);
+ 	  if (!aUnit)
+ 	    return FALSE;
  
  	  aUnit->name = aDieInfo.name;
  	  aUnit->low_pc = aDieInfo.low_pc;

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]