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(a)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@entry=0x7fffffffd078,
 abbrev_section=abbrev_section@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@entry=0x7fffffffd078,
 abbrev_section=abbrev_section@entry=0x28c91b0, section=0x28c9290,
 section=0x28c9290) at dwarf2read.c:3972
 #1  0x00000000006f1106 in read_and_check_comp_unit_head
 (header=header@entry=0x7fffffffd078, section=section@entry=0x28c9290,
 abbrev_section=abbrev_section@entry=0x28c91b0, info_ptr=0x7ffff7f4704b
 "",
     info_ptr@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@entry=0x7fffffffd270,
 abbrev_section=abbrev_section@entry=0x28c91b0,
 dwo_file=dwo_file@entry=0x28c91a0,
     die_reader_func=die_reader_func@entry=0x6f5110
 <create_dwo_debug_info_hash_table_reader>,
 data=data@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@entry=0x7ffff7f4ecd4
 "arch/x86/kernel/head64.dwo", comp_dir=<optimized out>,
 signature=signature@entry=13748681403860065761,
 is_debug_types=is_debug_types@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@entry=0x1f277d0,
 abbrev_table=abbrev_table@entry=0x0,
 use_existing_cu=use_existing_cu@entry=0, keep=keep@entry=0,
     die_reader_func=die_reader_func@entry=0x702420
 <process_psymtab_comp_unit_reader>, data=data@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@entry=0x1639970, verbose=verbose@entry=0) at
 psymtab.c:92
 #12 0x0000000000682644 in read_symbols
 (objfile=objfile@entry=0x1639970, add_flags=add_flags@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@entry=0x162c590, add_flags=add_flags@entry=4,
 addrs=addrs@entry=0x0, flags=flags@entry=0, parent=parent@entry=0x0,
 num_offsets=0, offsets=0x0) at symfile.c:1168
 #16 0x0000000000682085 in symbol_file_add_from_bfd
 (abfd=abfd@entry=0x162c590, add_flags=add_flags@entry=4,
 addrs=addrs@entry=0x0, flags=flags@entry=0, parent=parent@entry=0x0)
 at symfile.c:1258
 #17 0x00000000006820c8 in symbol_file_add
 (name=name@entry=0x7fffffffdd99 "/usr/build/linux/linux-4.10/vmlinux",
 add_flags=4, addrs=addrs@entry=0x0, flags=flags@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@entry=0x7fffffffdd99
 "/usr/build/linux/linux-4.10/vmlinux", from_tty=from_tty@entry=0,
 mask=mask@entry=6) at exceptions.c:584
 #20 0x00000000006a8e1d in captured_main
 (data=data@entry=0x7fffffffd8b0) at main.c:948
 #21 0x00000000006a6285 in catch_errors (func=func@entry=0x6a7d90
 <captured_main>, func_args=func_args@entry=0x7fffffffd8b0,
 errstring=errstring@entry=0x8f412a "", mask=mask@entry=6) at
 exceptions.c:557
 #22 0x00000000006a8fbb in gdb_main (args=args@entry=0x7fffffffd8b0) at
 main.c:1079
 #23 0x00000000006a9001 in gdb_main_entry (argc=<optimized out>,
 argv=argv@entry=0x7fffffffda18) at main.c:1099
 #24 0x00000000004f59af in gdb_main_loop (argc=<optimized out>,
 argc@entry=3, argv=argv@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(a)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(a)gmail.com
> I'm not a member of the list.
>
> Thanks & Regards,
> Jason
>