* dwarf2.c (_bfd_dwarf2_find_nearest_line): Try DWARF3-standard

and IRIX-specific shift-to-64-bit 4-byte lengths before following
addr_size.
This commit is contained in:
Alexandre Oliva 2003-04-09 09:56:17 +00:00
parent c1124b23a9
commit a3805e4e10
2 changed files with 31 additions and 17 deletions

View File

@ -1,3 +1,9 @@
2003-04-09 Alexandre Oliva <aoliva@redhat.com>
* dwarf2.c (_bfd_dwarf2_find_nearest_line): Try DWARF3-standard
and IRIX-specific shift-to-64-bit 4-byte lengths before following
addr_size.
2003-04-08 Alexandre Oliva <aoliva@redhat.com>
* elf32-mips.c (bfd_elf32_bfd_reloc_type_lookup): Detect (ctor)

View File

@ -1927,26 +1927,34 @@ _bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
bfd_boolean found;
unsigned int offset_size = addr_size;
if (addr_size == 4)
length = read_4_bytes (abfd, stash->info_ptr);
/* A 0xffffff length is the DWARF3 way of indicating we use
64-bit offsets, instead of 32-bit offsets. */
if (length == 0xffffffff)
{
length = read_4_bytes (abfd, stash->info_ptr);
if (length == 0xffffffff)
{
offset_size = 8;
length = read_8_bytes (abfd, stash->info_ptr + 4);
stash->info_ptr += 8;
}
else if (length == 0)
{
/* Handle (non-standard) 64-bit DWARF2 formats. */
offset_size = 8;
length = read_4_bytes (abfd, stash->info_ptr + 4);
stash->info_ptr += 4;
}
offset_size = 8;
length = read_8_bytes (abfd, stash->info_ptr + 4);
stash->info_ptr += 12;
}
/* A zero length is the IRIX way of indicating 64-bit offsets,
mostly because the 64-bit length will generally fit in 32
bits, and the endianness helps. */
else if (length == 0)
{
offset_size = 8;
length = read_4_bytes (abfd, stash->info_ptr + 4);
stash->info_ptr += 8;
}
/* In the absence of the hints above, we assume addr_size-sized
offsets, for backward-compatibility with pre-DWARF3 64-bit
platforms. */
else if (addr_size == 8)
{
length = read_8_bytes (abfd, stash->info_ptr);
stash->info_ptr = 8;
}
else
length = read_8_bytes (abfd, stash->info_ptr);
stash->info_ptr += addr_size;
stash->info_ptr += 4;
if (length > 0)
{