Word size confusion in display_debug_ranges() in binutils-2.18/binutils/dwarf.c

Julian Seward jseward@acm.org
Wed Jan 30 11:32:00 GMT 2008


Whilst messing with readelf -wR I noticed what looks to me like a
confusion in word sizes between the host and that pertaining to the
ELF file whose .debug_ranges section is to be displayed.  Specifically:

I built binutils-2.18 as 64-bit executables (on Core 2)

I did "readelf -wR" using said build, to examine .debug_ranges
sections in both 32-bit and 64-objects.

The problem is to do with the detection of so-called "base address"
specifiers in the range list info.  For a 64-bit object I get 

    Offset   Begin    End
    00000000 ffffffffffffffff 00000000 (base address)

which is correct, but on a 32-bit object

    Offset   Begin    End
    00000000 ffffffff 00000000 (start > end)

It should say "(base address)" instead of "(start > end)".

Looking at binutils-2.18/binutils/dwarf.c:2780 it's obvious why:

              /* Check base address specifiers.  */
              if (begin == -1UL && end != -1UL)
                {
                  base_address = end;
                  printf ("    %8.8lx %8.8lx %8.8lx (base address)\n",
                          offset, begin, end);
                  continue;
                }

Comparison against -1UL is at the host's word size.  But the DWARF3 spec
sec 2.17.3 ("Non-Contiguous Address Ranges") gives the impression, although
does not make it absolutely clear, that said values (begin, end) have a word 
size appropriate for the object file, not the host.

It would also mean that lines 2769, 2771 are bogus:

             begin = byte_get (start, pointer_size);

              end = byte_get (start, pointer_size);

begin and end are declared as unsigned long (== host word),
so these can only be correct when pointer_size == sizeof(unsigned long).

I attach two simple executables for testing purposes, 32-bit and 64-bit
versions of the same thing (test errs1.c from the Valgrind sources).
On a 64-bit platform, readelf -wR errs1-32 produces the result
below, with the incorrect "(start > end)" comment.

J

Contents of the .debug_ranges section:

    Offset   Begin    End
    00000000 ffffffff 00000000 (start > end)
    00000000 08048334 0804835a
    00000000 080482b0 080482bb
    00000000 080484fc 0804850f
    00000000 <End of list>
    00000028 ffffffff 00000000 (start > end)
    00000028 080482c5 080482c7
    00000028 08048514 08048518
    00000028 <End of list>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: errs1-32.bz2
Type: application/x-bzip2
Size: 4506 bytes
Desc: not available
URL: <https://sourceware.org/pipermail/binutils/attachments/20080130/b3887dd5/attachment.bz2>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: errs1-64.bz2
Type: application/x-bzip2
Size: 4647 bytes
Desc: not available
URL: <https://sourceware.org/pipermail/binutils/attachments/20080130/b3887dd5/attachment-0001.bz2>


More information about the Binutils mailing list