On Fri, Sep 13, 2024 at 10:51:33AM -0500, Lorenzo Gomez wrote:
> Thanks again for all of the insight into all this. The reason we're looking
> into this is because we develop a tool that extracts dwarf info from an elf
> file called juicer <https://github.com/WindhoverLabs/juicer>, which dumps
> it into a SQLITE db for other tools. And we want to make sure we document
> all the various cases when it comes to different types of object
> files(shared, object file, executable/linked, etc) so that our users are
> aware of all of this.
> 
> In any case it looks I can apply relocations with the "-r" switch in gcc
> and I tried the following:
> 
> gcc -r macro_test.o -o macro_test_relocatable

gcc -r is a relocatable partial link, not applying relocations.  Given that
the different .debug_macro sections are in different comdat group, such
relocations can't be resolved.

> As you mentioned there is the "DW_MACRO_import", but it has an offset of
> "0x00000000". Which, if I'm interpreting the DWARF5 spec correctly, means
> "end of macros" for macro import units (and we still don't get the "MAC4",
> "MAC5" macros). And this makes sense in that this is what
> "dwarf_get_macro_import" returns when I step through code in juicer. And I
> believe that dwarfdump is using libdwarf too so that makes sense.

DW_MACRO_import 0 means include the .debug_macro chunk from offset 0
in the section, which with applied relocations would be endless recursion
there.
Most likely just dwarfdump doesn't distinguish in that 0x00000000 what it
really is, it is really a relocation against .debug_macro+0, but not the
current .debug_macro, but .debug_macro in a different comdat group.
Admittedly, neither does readelf nor eu-readelf nor objdump.
You need to look up the relocations manually, e.g. readelf -wm -r will print
those (or even better just use some library which can handle all that stuff,
wonder if libdw does).
In my case, the first .debug_macro (not in comdat group) has
Relocation section '.rela.debug_macro' at offset 0x3548 contains 6 entries:
    Offset             Info             Type               Symbol's Value  
Symbol's Name + Addend
0000000000000003  000000080000000a R_X86_64_32            0000000000000000 
.debug_line + 0
0000000000000008  0000000b0000000a R_X86_64_32            0000000000000000 
.debug_macro + 0
0000000000000011  000000090000000a R_X86_64_32            0000000000000000 
.debug_str + 1b44
0000000000000017  000000090000000a R_X86_64_32            0000000000000000 
.debug_str + 400
000000000000001f  0000000c0000000a R_X86_64_32            0000000000000000 
.debug_macro + 0
0000000000000026  000000090000000a R_X86_64_32            0000000000000000 
.debug_str + 1370
relocations, and
Symbol table '.symtab' contains 16 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS 1.c
     2: 0000000000000000     0 SECTION LOCAL  DEFAULT    6 .text.startup
     3: 0000000000000000     0 SECTION LOCAL  DEFAULT    7 .debug_frame
     4: 0000000000000000     0 SECTION LOCAL  DEFAULT   11 .debug_info
     5: 0000000000000000     0 SECTION LOCAL  DEFAULT   13 .debug_abbrev
     6: 0000000000000000     0 SECTION LOCAL  DEFAULT   16 .debug_rnglists
     7: 0000000000000000     0 SECTION LOCAL  DEFAULT   18 .debug_macro
     8: 0000000000000000     0 SECTION LOCAL  DEFAULT   24 .debug_line
     9: 0000000000000000     0 SECTION LOCAL  DEFAULT   26 .debug_str
    10: 0000000000000000     0 SECTION LOCAL  DEFAULT   27 .debug_line_str
    11: 0000000000000000     0 SECTION LOCAL  DEFAULT   20 .debug_macro
    12: 0000000000000000     0 SECTION LOCAL  DEFAULT   22 .debug_macro
    13: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT    1 
wm4.0.6147fde142b63cfbd46fc3f1300479b2
    14: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT    2 
wm4.1.h.1.24d259e5524e60c87a9b7b969ac9e698
    15: 0000000000000000     3 FUNC    GLOBAL DEFAULT    6 main
and
  [18] .debug_macro      PROGBITS        0000000000000000 0001a4 00002c 00      
0   0  1
  [19] .rela.debug_macro RELA            0000000000000000 003548 000090 18   I 
31  18  8
  [20] .debug_macro      PROGBITS        0000000000000000 0001d0 000934 00   G  
0   0  1
  [21] .rela.debug_macro RELA            0000000000000000 0035d8 0024c0 18  IG 
31  20  8
  [22] .debug_macro      PROGBITS        0000000000000000 000b04 000010 00   G  
0   0  1
  [23] .rela.debug_macro RELA            0000000000000000 005a98 000030 18  IG 
31  22  8
So, the first DW_MACRO_import relocation is with symbol 0xb, i.e.
.debug_macro section 20, while the second one 0xc, so .debug_macro section
22.  The first one is in wm4.0.6147fde142b63cfbd46fc3f1300479b2 comdat group
and second in wm4.1.h.1.24d259e5524e60c87a9b7b969ac9e698 comdat group.

Note, this isn't just about .debug_macro section, if you look at .debug_info
in the relocatable object, e.g. dwarfdump prints there:
                    DW_AT_low_pc                0x00000000
                    DW_AT_stmt_list             0x00000000
                    DW_AT_macros                0x00000000
(though for ranges prints it inline:
                    DW_AT_ranges                0x0000000c

      Offset of rnglists entries: 0x0000000c
      [ 0] start,end             0x00000000 0x00000003
      [ 1] end of list                                
).
readelf -wi doesn't either, but at least prints the offset and one can look
up the relocations manually:
    <1a>   DW_AT_ranges      : 0xc
    <1e>   DW_AT_low_pc      : 0x0
    <26>   DW_AT_stmt_list   : 0x0
    <2a>   DW_AT_macros      : 0x0
00000000001a  00060000000a R_X86_64_32       0000000000000000 .debug_rnglists + 
c
000000000026  00080000000a R_X86_64_32       0000000000000000 .debug_line + 0
00000000002a  00070000000a R_X86_64_32       0000000000000000 .debug_macro + 0
but again when there are multiple sections with the same name in different
comdat groups, one can't really visually differentiate between the different
sections unless looking up the exact symbol.

All the tools are designed primarily with non-relocatable objects (i.e.
binaries and shared libraries) in mind...

        Jakub

-- 
Dwarf-discuss mailing list
Dwarf-discuss@lists.dwarfstd.org
https://lists.dwarfstd.org/mailman/listinfo/dwarf-discuss

Reply via email to