[llvm-dev] [DWARF] Handling empty ranges/location lists in ET_REL files

David Blaikie via llvm-dev llvm-dev at lists.llvm.org
Tue Jul 21 11:31:25 PDT 2020


Yep, sounds like a reasonable bug in llvm-dwarfdump to fix.

Probably the right way to fix this is to check whether the start/end
addresses have a section number. If they're zero with no section number,
then they're really zero & should terminate the list. Otherwise they
shouldn't.

Here's a reproducer for debug_ranges at least, without needing any patches
to LLVM:

$ cat range.cpp
void f1() { }
void f2() { __builtin_unreachable(); } // alternatively: "int f2() { }" -
both constructs are valid so long as f2 is never called, though it may
still need to have a valid address (could use pointers to it in a map for
some reason, etc)
int main() { }
$ clang++ range.cpp -ffunction-sections -g -O1 -c
$ llvm-dwarfdump-tot range.o -debug-info -debug-ranges
range.o:        file format elf64-x86-64

.debug_info contents:
0x00000000: Compile Unit: length = 0x00000079, format = DWARF32, version =
0x0004, abbr_offset = 0x0000, addr_size = 0x08 (next unit at 0x0000007d)

0x0000000b: DW_TAG_compile_unit
...
              DW_AT_ranges      (0x00000000
                 [0x0000000000000000, 0x0000000000000001))
...
.debug_ranges contents:
00000000 0000000000000000 0000000000000001
00000000 <End of list>
00000020 0000000000000000 0000000000000003
00000020 <End of list>
$ llvm-dwarfdump-tot a.out -debug-info -debug-ranges
a.out:  file format elf64-x86-64

.debug_info contents:
0x00000000: Compile Unit: length = 0x00000079, format = DWARF32, version =
0x0004, abbr_offset = 0x0000, addr_size = 0x08 (next unit at 0x0000007d)

0x0000000b: DW_TAG_compile_unit
...
              DW_AT_ranges      (0x00000000
                 [0x0000000000401110, 0x0000000000401111)
                 [0x0000000000401120, 0x0000000000401120)
                 [0x0000000000401120, 0x0000000000401123))
...

.debug_ranges contents:
00000000 0000000000401110 0000000000401111
00000000 0000000000401120 0000000000401120
00000000 0000000000401120 0000000000401123
00000000 <End of list>


On Tue, Jul 21, 2020 at 8:29 AM Robinson, Paul <paul.robinson at sony.com>
wrote:

> I agree it’s a bug.  An absolute (0, 0) pair is what indicates
> end-of-list.  You can get pairs of 0 addends with `.quad foo; .quad foo` or
> `.quad foo; .quad bar` but the former is an empty range and the latter
> would be a real range.
>
> I’d expect the identical issue to pop up in .debug_ranges, so a patch
> should address both.
>
> --paulr
>
>
>
> *From:* llvm-dev <llvm-dev-bounces at lists.llvm.org> *On Behalf Of *James
> Henderson via llvm-dev
> *Sent:* Tuesday, July 21, 2020 4:26 AM
> *To:* llvm-dev <llvm-dev at lists.llvm.org>; David Blaikie <
> dblaikie at gmail.com>; Alexey Lapshin <a.v.lapshin at mail.ru>
> *Subject:* [llvm-dev] [DWARF] Handling empty ranges/location lists in
> ET_REL files
>
>
>
> Hi all,
>
>
>
> I've put this email in a different thread, although it is quite similar to
> some of the threads on tombstoning etc, with similar underlying structural
> issues.
>
>
>
> Whilst prototyping my fragmented DWARF idea for GC-ing DWARF sections
> properly, I ran into an object in the game code I was using as my input
> where a v4 .debug_loc section had a location description that looked
> something like this:
>
>
>
> .quad foo
>
> .quad foo
>
> ... # location description
>
>
>
> where foo was a section symbol, i.e. the start and end address were the
> same. Consequently, there would be two relocations with 0 addend patching
> the start and end offset. When I was using llvm-dwarfdump to dump the
> .debug_loc section, I ended up with a decoding, and eventually a parsing
> error, because it saw a 0, 0 pair, so treated the entry as an end of list
> entry, and assumed the location description was the start of the next list.
>
>
>
> The debug_loc parsing code treats 0, 0 pairs as end of list entries,
> whether or not they are relocated. I think this is a bug - if there are
> relocations we can be reasonably confident that the compiler did not intend
> it to be the end of the list, and at link time, this probably won't get
> resolved to 0, 0 (it's still technically possible it will, if 0 is a valid
> address, and the corresponding section was put at that address, but that's
> outside the scope of this email).
>
>
>
> I've got a fairly simple change that could solve this, but it would
> require to check for the presence of a relocation at either address, in the
> event 0, 0 was read. Should I go ahead with tidying up the change/testing
> it etc? Or do we want a different solution to this problem (aside from
> using DWARFv5 of course!)?
>
>
>
> Related aside: I haven't checked, but it's quite possible there's a
> similar problem in .debug_ranges parsing.
>
>
>
> James
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20200721/ddd58870/attachment.html>


More information about the llvm-dev mailing list