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] | |
On Tue, Jul 29, 2008 at 8:16 AM, Dmitry Smirnov <divis1969@gmail.com> wrote:
> Hi,
>
> While using BFD (from binutils-2.18) for retriving debug info from ELF
> file generated by ADS 1.2 compiler, I've encountered a problem with
> DW_AT_abstract_origin processing.
> In my case, this attribute is used to refer a function using
> DW_FORM_ref_addr reference. Function find_abstract_instance_name (file
> dwarf2.c) totally ignores this and tries to use the value as is:
> info_ptr = unit->info_ptr_unit + die_ref;
Is this the same as
http://www.sourceware.org/bugzilla/show_bug.cgi?id=3191
I am enclosing my patch here.
H.J.
---
>
> This caused BFD to crash while attempting to find a name.
>
> I had changed this function in such way:
>
> find_abstract_instance_name (struct comp_unit *unit, bfd_uint64_t
> die_ref, enum dwarf_form form)
> {
> ...
> if(form == DW_FORM_ref_addr)
> {
> info_ptr = unit->stash->info_ptr_start + (int)(die_ref);
> if(info_ptr >= unit->stash->info_ptr_end)
> {
> (*_bfd_error_handler) (_("Dwarf Error: reference addr is over
> limits %u."),
> die_ref);
> }
> }
> else
> {
> info_ptr = unit->info_ptr_unit + die_ref;
> }
>
> Not sure this is correct fix since I've just learned DWARF2 for couple
> hours. Nevertheless, it works for me.
>
> Perhaps, it can be used in future BFD versions.
>
> Dmitry
>
> Here is the whole patch:
>
> --- dwarf2.c 2008-07-16 23:24:49.359375000 +0400
> +++ dwarf2.c 2008-07-17 00:59:54.093750000 +0400
> @@ -96,6 +96,7 @@
>
> /* Pointer to the end of the .debug_info section memory buffer. */
> bfd_byte *info_ptr_end;
> + bfd_byte *info_ptr_start;
>
> /* Pointer to the bfd, section and address of the beginning of the
> section. The bfd might be different than expected because of
> @@ -1710,7 +1711,7 @@
> }
>
> static char *
> -find_abstract_instance_name (struct comp_unit *unit, bfd_uint64_t die_ref)
> +find_abstract_instance_name (struct comp_unit *unit, bfd_uint64_t
> die_ref, enum dwarf_form form)
> {
> bfd *abfd = unit->abfd;
> bfd_byte *info_ptr;
> @@ -1721,7 +1722,12 @@
>
> if(form == DW_FORM_ref_addr)
> {
> - info_ptr = unit->stash->info_ptr + die_ref;
> + info_ptr = unit->stash->info_ptr_start + (int)(die_ref);
> + if(info_ptr >= unit->stash->info_ptr_end)
> + {
> + (*_bfd_error_handler) (_("Dwarf Error: reference addr is over
> limits %u."),
> + die_ref);
> + }
> }
> else
> {
> @@ -1753,7 +1759,7 @@
> name = attr.u.str;
> break;
> case DW_AT_specification:
> - name = find_abstract_instance_name (unit, attr.u.val);
> + name = find_abstract_instance_name (unit, attr.u.val, attr.form);
> break;
> case DW_AT_MIPS_linkage_name:
> name = attr.u.str;
> @@ -1915,7 +1921,7 @@
> break;
>
> case DW_AT_abstract_origin:
> - func->name = find_abstract_instance_name (unit, attr.u.val);
> + func->name = find_abstract_instance_name (unit, attr.u.val, attr.form);
> break;
>
> case DW_AT_name:
> @@ -2926,6 +2932,7 @@
> goto done;
>
> stash->info_ptr_end = stash->info_ptr;
> + stash->info_ptr_start = stash->info_ptr;
>
> for (msec = find_debug_info (debug_bfd, NULL);
> msec;
>
Attachment:
bfd-ref_addr-7.patch
Description: Binary data
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |