diff options
-rw-r--r-- | bfd/ChangeLog | 11 | ||||
-rw-r--r-- | bfd/dwarf1.c | 80 |
2 files changed, 54 insertions, 37 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index d537146..29af7d3 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,14 @@ +2008-02-14 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. + 2008-02-14 Alan Modra <amodra@bigpond.net.au> * elflink.c (compute_bucket_count): Warning fixes. diff --git a/bfd/dwarf1.c b/bfd/dwarf1.c index 6f02cb8..3c2cf79 100644 --- a/bfd/dwarf1.c +++ b/bfd/dwarf1.c @@ -35,24 +35,27 @@ struct dwarf1_debug /* 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. */ - char* debug_section; + bfd_byte *debug_section; /* Pointer to the end of the .debug_info section memory buffer. */ - char* debug_section_end; + bfd_byte *debug_section_end; /* The buffer for the .line section. */ - char* line_section; + bfd_byte *line_section; /* End of that buffer. */ - char* line_section_end; + bfd_byte *line_section_end; /* The current or next unread die within the .debug section. */ - char* currentDie; + bfd_byte *currentDie; }; /* One dwarf1_unit for each parsed compilation unit die. */ @@ -63,7 +66,7 @@ struct dwarf1_unit struct dwarf1_unit* prev; /* Name of the compilation unit. */ - char* name; + char *name; /* The highest and lowest address used in the compilation unit. */ unsigned long low_pc; @@ -76,7 +79,7 @@ struct dwarf1_unit unsigned long stmt_list_offset; /* If non-zero, a pointer to the first child of this unit. */ - char* first_child; + bfd_byte *first_child; /* How many line entries? */ unsigned long line_count; @@ -141,8 +144,11 @@ alloc_dwarf1_unit (struct dwarf1_debug* stash) bfd_size_type amt = sizeof (struct dwarf1_unit); struct dwarf1_unit* x = bfd_zalloc (stash->abfd, amt); - x->prev = stash->lastUnit; - stash->lastUnit = x; + if (x) + { + x->prev = stash->lastUnit; + stash->lastUnit = x; + } return x; } @@ -156,8 +162,11 @@ alloc_dwarf1_func (struct dwarf1_debug* stash, struct dwarf1_unit* aUnit) 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; + if (x) + { + x->prev = aUnit->func_list; + aUnit->func_list = x; + } return x; } @@ -172,11 +181,11 @@ alloc_dwarf1_func (struct dwarf1_debug* stash, struct dwarf1_unit* aUnit) static bfd_boolean parse_die (bfd * abfd, struct die_info * aDieInfo, - char * aDiePtr, - char * aDiePtrEnd) + bfd_byte * aDiePtr, + bfd_byte * aDiePtrEnd) { - char* this_die = aDiePtr; - char* xptr = this_die; + bfd_byte *this_die = aDiePtr; + bfd_byte *xptr = this_die; memset (aDieInfo, 0, sizeof (* aDieInfo)); @@ -242,8 +251,8 @@ parse_die (bfd * abfd, break; case FORM_STRING: if (attr == AT_name) - aDieInfo->name = xptr; - xptr += strlen (xptr) + 1; + aDieInfo->name = (char *)xptr; + xptr += strlen (aDieInfo->name) + 1; break; } } @@ -258,7 +267,7 @@ parse_die (bfd * abfd, static bfd_boolean parse_line_table (struct dwarf1_debug* stash, struct dwarf1_unit* aUnit) { - char* xptr; + bfd_byte *xptr; /* Load the ".line" section from the bfd if we haven't already. */ if (stash->line_section == 0) @@ -271,18 +280,13 @@ parse_line_table (struct dwarf1_debug* stash, struct dwarf1_unit* aUnit) return FALSE; size = msec->rawsize ? msec->rawsize : msec->size; - stash->line_section = bfd_alloc (stash->abfd, size); + stash->line_section + = bfd_simple_get_relocated_section_contents + (stash->abfd, msec, NULL, stash->syms); 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; } @@ -290,7 +294,7 @@ parse_line_table (struct dwarf1_debug* stash, struct dwarf1_unit* aUnit) if (xptr < stash->line_section_end) { unsigned long eachLine; - char *tblend; + bfd_byte *tblend; unsigned long base; bfd_size_type amt; @@ -309,6 +313,8 @@ parse_line_table (struct dwarf1_debug* stash, struct dwarf1_unit* aUnit) /* 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++) { @@ -338,7 +344,7 @@ parse_line_table (struct dwarf1_debug* stash, struct dwarf1_unit* aUnit) static bfd_boolean parse_functions_in_unit (struct dwarf1_debug* stash, struct dwarf1_unit* aUnit) { - char* eachDie; + bfd_byte *eachDie; if (aUnit->first_child) for (eachDie = aUnit->first_child; @@ -357,6 +363,8 @@ parse_functions_in_unit (struct dwarf1_debug* stash, struct dwarf1_unit* aUnit) || 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; @@ -442,7 +450,7 @@ dwarf1_unit_find_nearest_line (struct dwarf1_debug* stash, bfd_boolean _bfd_dwarf1_find_nearest_line (bfd *abfd, asection *section, - asymbol **symbols ATTRIBUTE_UNUSED, + asymbol **symbols, bfd_vma offset, const char **filename_ptr, const char **functionname_ptr, @@ -478,21 +486,17 @@ _bfd_dwarf1_find_nearest_line (bfd *abfd, return FALSE; size = msec->rawsize ? msec->rawsize : msec->size; - stash->debug_section = bfd_alloc (abfd, size); + stash->debug_section + = bfd_simple_get_relocated_section_contents (abfd, msec, NULL, + symbols); 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; + stash->syms = symbols; } /* A null debug_section indicates that there was no dwarf1 info @@ -522,6 +526,8 @@ _bfd_dwarf1_find_nearest_line (bfd *abfd, { struct dwarf1_unit* aUnit = alloc_dwarf1_unit (stash); + if (!aUnit) + return FALSE; aUnit->name = aDieInfo.name; aUnit->low_pc = aDieInfo.low_pc; |