This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[patch] relocating dwarf1 information
- From: Nathan Sidwell <nathan at codesourcery dot com>
- To: binutils <binutils at sources dot redhat dot com>
- Date: Tue, 12 Feb 2008 17:06:22 +0000
- Subject: [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;