[Crash-utility] is crash 7.1.8 meant to support CONFIG_DEBUG_INFO_SPLIT=y / CONFIG_DEBUG_INFO_DWARF4=y kernel builds?

Jason Vas Dias jason.vas.dias at gmail.com
Thu Feb 23 11:24:32 UTC 2017


Oops -
$ objdump -fh head64.dwo

head64.dwo:     file format elf64-x86-64
architecture: i386:x86-64, flags 0x00000010:
HAS_SYMS
start address 0x0000000000000000

Sections:
Idx Name          Size      VMA               LMA               File off  Algn
  0 .debug_info.dwo 0000ac4a  0000000000000000  0000000000000000  00000040  2**0
                  CONTENTS, READONLY, DEBUGGING, EXCLUDE
  1 .debug_abbrev.dwo 00000637  0000000000000000  0000000000000000
00006fd9  2**0
                  CONTENTS, READONLY, DEBUGGING, EXCLUDE
  2 .debug_loc.dwo 00000266  0000000000000000  0000000000000000  0000725b  2**0
                  CONTENTS, READONLY, DEBUGGING, EXCLUDE
  3 .debug_line.dwo 00000850  0000000000000000  0000000000000000  00007374  2**0
                  CONTENTS, READONLY, DEBUGGING, EXCLUDE
  4 .debug_str_offsets.dwo 000025f0  0000000000000000
0000000000000000  000076eb  2**0
                  CONTENTS, READONLY, DEBUGGING, EXCLUDE
  5 .debug_str.dwo 000071c1  0000000000000000  0000000000000000  00008514  2**0


The offset 64 is correct .
But the versions are definitely within range and not 0, so something
else has gone
wrong to end up with a DWARF header version of 0 :



$ readelf --debug-dump head64.dwo  | head -8
Contents of the .debug_info.dwo section:

  Compilation Unit @ offset 0x0:
   Length:        0xac46 (32-bit)
   Version:       4
   Abbrev Offset: 0x0
   Pointer Size:  8
 <0><b>: Abbrev Number: 1 (DW_TAG_compile_unit)


ie. this is a valid .dwo file, readable by binutil-2.27 BFD ,
but gdb-7.6 BFD is just getting things wrong.


On 23/02/2017, Jason Vas Dias <jason.vas.dias at gmail.com> wrote:
> I guess I  answered my own question - the answer is : NO  ??
> I guess a more modern *.dwo format is being used that is not
> understood by the version of bfd used by gdb-7.6 .
> Debugging crash with gdb 7.11.1 shows BFD is getting
> the section offsets wrong :
>
> $ gdb --args crash $BLD/linux-4.10/vmlinux /proc/kcore
> GNU gdb (GDB) 7.11.1
> ...
> (gdb) b dwarf2read.c:3972
> (gdb) c
> Breakpoint 2, error_check_comp_unit_head
> (header=header at entry=0x7fffffffd078,
> abbrev_section=abbrev_section at entry=0x28c91b0, section=0x28c9290,
> section=0x28c9290) at dwarf2read.c:3972
> 3972	    error (_("Dwarf Error: wrong version in compilation unit header "
> (gdb) where
> #0  error_check_comp_unit_head (header=header at entry=0x7fffffffd078,
> abbrev_section=abbrev_section at entry=0x28c91b0, section=0x28c9290,
> section=0x28c9290) at dwarf2read.c:3972
> #1  0x00000000006f1106 in read_and_check_comp_unit_head
> (header=header at entry=0x7fffffffd078, section=section at entry=0x28c9290,
> abbrev_section=abbrev_section at entry=0x28c91b0, info_ptr=0x7ffff7f4704b
> "",
>     info_ptr at entry=0x7ffff7f47040 "\001", is_debug_types_section=0) at
> dwarf2read.c:4018
> #2  0x00000000006f11f2 in init_cutu_and_read_dies_no_follow
> (this_cu=this_cu at entry=0x7fffffffd270,
> abbrev_section=abbrev_section at entry=0x28c91b0,
> dwo_file=dwo_file at entry=0x28c91a0,
>     die_reader_func=die_reader_func at entry=0x6f5110
> <create_dwo_debug_info_hash_table_reader>,
> data=data at entry=0x7fffffffd240) at dwarf2read.c:4829
> #3  0x00000000006f34e8 in create_dwo_debug_info_hash_table
> (dwo_file=0x28c91a0) at dwarf2read.c:8394
> #4  open_and_init_dwo_file (comp_dir=<optimized out>,
> dwo_name=0x7ffff7f4ecd4 "arch/x86/kernel/head64.dwo") at
> dwarf2read.c:8978
> #5  lookup_dwo_cutu (dwo_name=dwo_name at entry=0x7ffff7f4ecd4
> "arch/x86/kernel/head64.dwo", comp_dir=<optimized out>,
> signature=signature at entry=13748681403860065761,
> is_debug_types=is_debug_types at entry=0, this_unit=0x1f277d0)
>     at dwarf2read.c:9182
> #6  0x00000000006f410f in lookup_dwo_comp_unit
> (signature=13748681403860065761, comp_dir=<optimized out>,
> dwo_name=0x7ffff7f4ecd4 "arch/x86/kernel/head64.dwo",
> this_cu=0x1f277d0) at dwarf2read.c:9237
> #7  init_cutu_and_read_dies (this_cu=this_cu at entry=0x1f277d0,
> abbrev_table=abbrev_table at entry=0x0,
> use_existing_cu=use_existing_cu at entry=0, keep=keep at entry=0,
>     die_reader_func=die_reader_func at entry=0x702420
> <process_psymtab_comp_unit_reader>, data=data at entry=0x7fffffffd4ac) at
> dwarf2read.c:4656
> #8  0x00000000006f8cc8 in process_psymtab_comp_unit
> (this_cu=0x1f277d0, want_partial_unit=0) at dwarf2read.c:5053
> #9  0x0000000000709e44 in dwarf2_build_psymtabs_hard
> (objfile=<optimized out>) at dwarf2read.c:5548
> #10 dwarf2_build_psymtabs (objfile=0x1639970) at dwarf2read.c:3855
> #11 0x000000000067bc0e in require_partial_symbols
> (objfile=objfile at entry=0x1639970, verbose=verbose at entry=0) at
> psymtab.c:92
> #12 0x0000000000682644 in read_symbols
> (objfile=objfile at entry=0x1639970, add_flags=add_flags at entry=4) at
> symfile.c:862
> #13 0x00000000006819dc in syms_from_objfile_1 (add_flags=4,
> num_offsets=0, offsets=0x0, addrs=<optimized out>, objfile=0x1639970)
> at symfile.c:1045
> #14 syms_from_objfile (objfile=0x1639970, addrs=<optimized out>,
> offsets=0x0, num_offsets=0, add_flags=4) at symfile.c:1063
> #15 0x0000000000681f14 in symbol_file_add_with_addrs_or_offsets
> (abfd=abfd at entry=0x162c590, add_flags=add_flags at entry=4,
> addrs=addrs at entry=0x0, flags=flags at entry=0, parent=parent at entry=0x0,
> num_offsets=0, offsets=0x0) at symfile.c:1168
> #16 0x0000000000682085 in symbol_file_add_from_bfd
> (abfd=abfd at entry=0x162c590, add_flags=add_flags at entry=4,
> addrs=addrs at entry=0x0, flags=flags at entry=0, parent=parent at entry=0x0)
> at symfile.c:1258
> #17 0x00000000006820c8 in symbol_file_add
> (name=name at entry=0x7fffffffdd99 "/usr/build/linux/linux-4.10/vmlinux",
> add_flags=4, addrs=addrs at entry=0x0, flags=flags at entry=0) at
> symfile.c:1274
> #18 0x0000000000682113 in symbol_file_add_main_1 (args=0x7fffffffdd99
> "/usr/build/linux/linux-4.10/vmlinux", from_tty=0, flags=0) at
> symfile.c:1300
> #19 0x00000000006a6359 in catch_command_errors (command=0x682140
> <symbol_file_add_main>, arg=arg at entry=0x7fffffffdd99
> "/usr/build/linux/linux-4.10/vmlinux", from_tty=from_tty at entry=0,
> mask=mask at entry=6) at exceptions.c:584
> #20 0x00000000006a8e1d in captured_main
> (data=data at entry=0x7fffffffd8b0) at main.c:948
> #21 0x00000000006a6285 in catch_errors (func=func at entry=0x6a7d90
> <captured_main>, func_args=func_args at entry=0x7fffffffd8b0,
> errstring=errstring at entry=0x8f412a "", mask=mask at entry=6) at
> exceptions.c:557
> #22 0x00000000006a8fbb in gdb_main (args=args at entry=0x7fffffffd8b0) at
> main.c:1079
> #23 0x00000000006a9001 in gdb_main_entry (argc=<optimized out>,
> argv=argv at entry=0x7fffffffda18) at main.c:1099
> #24 0x00000000004f59af in gdb_main_loop (argc=<optimized out>,
> argc at entry=3, argv=argv at entry=0x7fffffffda18) at gdb_interface.c:76
> #25 0x0000000000464d3d in main (argc=3, argv=0x7fffffffda18) at main.c:707
>
> (gdb) p *header
> $3 = {length = 1, version = 0, addr_size = 0 '\000', signed_addr_p = 0
> '\000', abbrev_offset = {sect_off = 2890530816}, offset_size = 4,
> initial_length_size = 4, offset = {sect_off = 0}, first_die_offset =
> {cu_off = 11}}
>
> we genuinely have a bad header here, because bfd seems to have got the
> section offsets wrong:
>
> If I do:
>
> $ objdump -fh head64.o
>
> head64.o:     file format elf64-x86-64
> architecture: i386:x86-64, flags 0x00000011:
> HAS_RELOC, HAS_SYMS
> start address 0x0000000000000000
>
> Sections:
> ...
> Idx Name          Size      VMA               LMA               File off
> Algn
>  11 .debug_info   00000034  0000000000000000  0000000000000000  00000593
> 2**0
>                   CONTENTS, RELOC, READONLY, DEBUGGING
>  12 .debug_abbrev 0000001d  0000000000000000  0000000000000000  000005c7
> 2**0
>                   CONTENTS, READONLY, DEBUGGING
> ...
>
> So the .debug_info section we are looking at should begin at file
> offset 0x593 = 1427, right ?
>
> But the bfd has the section offsets wrong :
>
> (gdb) p *section->asection
> $40 = {name = 0x28c2ba3 ".debug_info.dwo", id = 139, index = 0, next =
> 0x28c2f70, prev = 0x0, flags = 41224, user_set_vma = 1, linker_mark =
> 0, linker_has_input = 0, gc_mark = 0, compress_status = 0,
> segment_mark = 0, sec_info_type = 0,
>   use_rela_p = 1, sec_flg0 = 0, sec_flg1 = 0, sec_flg2 = 0, sec_flg3 =
> 0, sec_flg4 = 0, sec_flg5 = 0, vma = 0, lma = 0, size = 28569, rawsize
> = 0, compressed_size = 0, relax = 0x0, relax_count = 0, output_offset
> = 0,
>   output_section = 0x0, alignment_power = 0, relocation = 0x0,
> orelocation = 0x0, reloc_count = 0, filepos = 64, rel_filepos = 0,
> line_filepos = 0, userdata = 0x28c53d8, contents = 0x0, lineno = 0x0,
> lineno_count = 0, entsize = 0,
>   kept_section = 0x0, moving_line_filepos = 0, target_index = 0,
> used_by_bfd = 0x28c2c10, constructor_chain = 0x0, owner = 0x2465c10,
> symbol = 0x28c2ce8, symbol_ptr_ptr = 0x28c2f38, map_head = {link_order
> = 0x0, s = 0x0}, map_tail = {
>     link_order = 0x0, s = 0x0}}
>
> 'filepos=64' does not correspond to any section header offset or section
> offset
> in the file .
>
> Oh well, I'll just have to rebuild kernel without
> CONFIG_DEBUG_INFO_SPLIT=y / CONFIG_DEBUG_INFO_DWARF4=y
> .
> This is a shame - the massive decrease in overall build size makes
> building kernels
> a much less daunting  task on my limited storage machine .
> I hope crash's bfd is upgraded to handle the modern .dwo format from gcc
> 5.4.0 +
> binutils-2.27 soon.
> Is crash ever going to migrate to gdb-7.11.1+ ?
>
> Regards,
> Jason
>
> On 23/02/2017, Jason Vas Dias <jason.vas.dias at gmail.com> wrote:
>> Hi -
>> I have these kernel config options set for a successful kernel build :
>>
>> $ grep DEBUG_INFO .config
>> CONFIG_DEBUG_INFO=y
>> # CONFIG_DEBUG_INFO_REDUCED is not set
>> CONFIG_DEBUG_INFO_SPLIT=y
>> CONFIG_DEBUG_INFO_DWARF4=y
>>
>> This splits debug_info sections into separate ${X}.dwo files for each
>> kernel
>> object produced.
>>
>> I modified several files and did a 'make bzImage' ,  which succeeded,
>> and installed the kernel, and tried to run crash-7.1.8 to inspect a
>> few things, but it says:
>> <quote><pre>
>> $ crash vmlinuz /proc/kcore
>> ....
>> gdb called without error_hook: Dwarf Error: wrong version in
>> compilation unit header (is 0, should be 2, 3, or 4) [in module
>> /usr/build/linux/linux-4.10/arch/x86/kernel/head64.dwo]
>> Dwarf Error: wrong version in compilation unit header (is 0, should be
>> 2, 3, or 4) [in module
>> /usr/build/linux/linux-4.10/arch/x86/kernel/head64.dwo]
>>
>> crash: vmlinux: no debugging data available
>> </pre></quote>
>>
>> But the files still exist from the build:
>> -rw-r--r-- 1 root root 47784 Feb 21 20:07
>> /usr/build/linux/linux-4.10/arch/x86/kernel/head64.dwo
>> -rw-r--r-- 1 root root 17072 Feb 21 20:07
>> /usr/build/linux/linux-4.10/arch/x86/kernel/head64.o
>> in the same directory as the head64.c file .
>>
>> I thought the whole point of 'vmlinux' was that it contained the
>> debug_info
>> ?
>> Do I need to re-link a vmlinux.dbg with all the *.dwo files
>> corresponding to each '*.o' file vmlinux contains , and vmlinux?
>> If so, then I don't see much point in the 'CONFIG_DEBUG_INFO_SPLIT=y'
>> option. Shouldn't a 'vmlinux.dwo' file be produced, containing all
>> concatenated
>> debug_info sections for 'vmlinux' ?
>> I guess crash just doesn't support
>> CONFIG_DEBUG_INFO_SPLIT=y / CONFIG_DEBUG_INFO_DWARF4=y ?
>>
>> Sorry for the newbie type question.  Please respond to :
>>   jason.vas.dias at gmail.com
>> I'm not a member of the list.
>>
>> Thanks & Regards,
>> Jason
>>
>




More information about the Crash-utility mailing list