On Thu, Sep 12, 2024 at 10:52:33AM -0700, David Blaikie via Dwarf-discuss wrote:
> Looks probably like a bug in GCC and best discussed in their forum? (clang
> seems to produce the macro in the macinfo if you compile with
> `-fdebug-macro` (& you have to put some emitted entity (like a function
> definition) in the file before Clang will produce any debug info for the
> file))
GCC emits that the .debug_macro snippets from headers (in chunks
uninterrupted by inclusion of other headers) in .debug_macro comdat sections
with wm4.0.6147fde142b63cfbd46fc3f1300479b2 etc. comdat groups and it is
just the linker which merges stuff back (and gets rid of redundancies).
So say for
/tmp/1.h
#define MAC4
#define MAC5 1
/tmp/1.c
#define MAC1 2
#define MAC2 3
#include "/tmp/1.h"
#define MAC3 4
int main () { return 0; }
gcc -O2 -g3 -c -o /tmp/1.o /tmp/1.c
gcc -o /tmp/1 /tmp/1.o
readelf -WS /tmp/1.o | grep debug_macro
[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
there are 2 extra .debug_macro sections in comdat groups, and then in the
resulting binary one has:
readelf -wm /tmp/1
Contents of the .debug_macro section:
Offset: 0x0
Version: 5
Offset size: 4
Offset into .debug_line: 0x0
DW_MACRO_import - offset : 0x2c
DW_MACRO_start_file - lineno: 0 filenum: 1
DW_MACRO_define_strp - lineno : 1 macro : MAC1 2
DW_MACRO_define_strp - lineno : 2 macro : MAC2 3
DW_MACRO_start_file - lineno: 3 filenum: 2
DW_MACRO_import - offset : 0x960
DW_MACRO_end_file
DW_MACRO_define_strp - lineno : 4 macro : MAC3 4
DW_MACRO_end_file
...
Offset: 0x960
Version: 5
Offset size: 4
DW_MACRO_define_strp - lineno : 1 macro : MAC4
DW_MACRO_define_strp - lineno : 2 macro : MAC5 1
Left out the chunk at 0x2c, that is for predefined macros, for
showing how it works that is just a clutter.
Jakub
--
Dwarf-discuss mailing list
[email protected]
https://lists.dwarfstd.org/mailman/listinfo/dwarf-discuss