Merge pull request #284 from haberman/elf-headers2

Report ELF section/segment headers as such.
diff --git a/src/elf.cc b/src/elf.cc
index 79d9cc7..58b1b38 100644
--- a/src/elf.cc
+++ b/src/elf.cc
@@ -1065,12 +1065,7 @@
                            contents);
           } else if (report_by == kReportBySectionName) {
             sink->AddRange("elf_section", name, full_addr, vmsize, contents);
-            sink->AddFileRange("elf_section_header", name, section.range());
           } else if (report_by == kReportByEscapedSectionName) {
-            if (!sink->IsBaseMap()) {
-              sink->AddFileRangeForFileRange("elf_section", contents,
-                                             section.range());
-            }
             sink->AddRange("elf_section",
                            std::string("[section ") + std::string(name) + "]",
                            full_addr, vmsize, contents);
@@ -1133,21 +1128,6 @@
 }
 
 static void DoReadELFSegments(RangeSink* sink, ReportSegmentsBy report_by) {
-  if (!sink->IsBaseMap()) {
-    ForEachElf(sink->input_file(), sink,
-               [=](const ElfFile& elf, string_view /*filename*/,
-                   uint32_t /*index_base*/) {
-                 for (Elf64_Xword i = 0; i < elf.header().e_phnum; i++) {
-                   ElfFile::Segment segment;
-                   elf.ReadSegment(i, &segment);
-                   std::string name = GetSegmentName(segment, i, report_by);
-
-                   sink->AddFileRange("elf_segment_header", name,
-                                      segment.range());
-                 }
-               });
-  }
-
   ForEachElf(sink->input_file(), sink,
              [=](const ElfFile& elf, string_view /*filename*/,
                  uint32_t /*index_base*/) {
@@ -1247,21 +1227,23 @@
 
 void AddCatchAll(RangeSink* sink) {
   // The last-line fallback to make sure we cover the entire VM space.
-  if (sink->data_source() != DataSource::kSegments) {
-    DoReadELFSections(sink, kReportByEscapedSectionName);
+  if (sink->IsBaseMap() || sink->data_source() != DataSource::kSegments) {
+    if (!sink->IsBaseMap()) {
+      DoReadELFSections(sink, kReportByEscapedSectionName);
+    }
+    ForEachElf(sink->input_file(), sink,
+               [sink](const ElfFile& elf, string_view /*filename*/,
+                      uint32_t /*index_base*/) {
+                 sink->AddFileRange("elf_catchall", "[ELF Header]",
+                                    elf.header_region());
+                 sink->AddFileRange("elf_catchall", "[ELF Section Headers]",
+                                    elf.section_headers());
+                 sink->AddFileRange("elf_catchall", "[ELF Program Headers]",
+                                    elf.segment_headers());
+               });
   }
   DoReadELFSegments(sink, kReportByEscapedSegmentName);
 
-  ForEachElf(sink->input_file(), sink,
-             [sink](const ElfFile& elf, string_view /*filename*/,
-                    uint32_t /*index_base*/) {
-               sink->AddFileRange("elf_catchall", "[ELF Headers]",
-                                  elf.header_region());
-               sink->AddFileRange("elf_catchall", "[ELF Headers]",
-                                  elf.section_headers());
-               sink->AddFileRange("elf_catchall", "[ELF Headers]",
-                                  elf.segment_headers());
-             });
 
   // The last-line fallback to make sure we cover the entire file.
   sink->AddFileRange("elf_catchall", "[Unmapped]", sink->input_file().data());
diff --git a/tests/elf/sections/empty-bin-64.test b/tests/elf/sections/empty-bin-64.test
index 2873b4e..e77ea1e 100644
--- a/tests/elf/sections/empty-bin-64.test
+++ b/tests/elf/sections/empty-bin-64.test
@@ -51,19 +51,11 @@
 ...
 
 # CHECK: FILE MAP:
-# CHECK: 000-040	         64		[ELF Headers]
+# CHECK: 000-040	         64		[ELF Header]
 # CHECK: 040-070	         48		.comment
 # CHECK: 070-118	        168		.symtab
 # CHECK: 118-148	         48		.strtab
 # CHECK: 148-190	         72		.shstrtab
-# CHECK: 190-1d0	         64		[ELF Headers]
-# CHECK: 1d0-210	         64		.text
-# CHECK: 210-250	         64		.data
-# CHECK: 250-290	         64		.bss
-# CHECK: 290-2d0	         64		.comment
-# CHECK: 2d0-310	         64		.note.GNU-stack
-# CHECK: 310-350	         64		.symtab
-# CHECK: 350-390	         64		.strtab
-# CHECK: 390-3d0	         64		.shstrtab
+# CHECK: 190-3d0	        576		[ELF Section Headers]
 
 # CHECK: VM MAP:
diff --git a/tests/elf/sections/empty-obj-64.test b/tests/elf/sections/empty-obj-64.test
index 1645417..bd0b4e4 100644
--- a/tests/elf/sections/empty-obj-64.test
+++ b/tests/elf/sections/empty-obj-64.test
@@ -51,19 +51,11 @@
 ...
 
 # CHECK: FILE MAP:
-# CHECK: 000-040	         64		[ELF Headers]
+# CHECK: 000-040	         64		[ELF Header]
 # CHECK: 040-070	         48		.comment
 # CHECK: 070-118	        168		.symtab
 # CHECK: 118-148	         48		.strtab
 # CHECK: 148-190	         72		.shstrtab
-# CHECK: 190-1d0	         64		[ELF Headers]
-# CHECK: 1d0-210	         64		.text
-# CHECK: 210-250	         64		.data
-# CHECK: 250-290	         64		.bss
-# CHECK: 290-2d0	         64		.comment
-# CHECK: 2d0-310	         64		.note.GNU-stack
-# CHECK: 310-350	         64		.symtab
-# CHECK: 350-390	         64		.strtab
-# CHECK: 390-3d0	         64		.shstrtab
+# CHECK: 190-3d0	        576		[ELF Section Headers]
 
 # CHECK: VM MAP:
diff --git a/tests/elf/sections/musl-static-bin.test b/tests/elf/sections/musl-static-bin.test
index 9a3c38f..645f969 100644
--- a/tests/elf/sections/musl-static-bin.test
+++ b/tests/elf/sections/musl-static-bin.test
@@ -19,7 +19,7 @@
 # (or possibly yaml2obj). The binary did not fully round-trip successfully.
 
 # RUN: %yaml2obj %s -o %t.obj
-# RUN: %bloaty --raw-map %t.obj | %FileCheck %s
+# RUN: %bloaty --raw-map -d segments,sections %t.obj | %FileCheck %s
 
 --- !ELF
 FileHeader:
@@ -534,57 +534,37 @@
 ...
 
 # CHECK: FILE MAP:
-# CHECK: 0000-0040	         64		[ELF Headers]
-# CHECK: 0040-0078	         56		[LOAD #0 [R]]
-# CHECK: 0078-00b0	         56		[LOAD #1 [RX]]
-# CHECK: 00b0-00e8	         56		[LOAD #2 [R]]
-# CHECK: 00e8-0120	         56		[LOAD #3 [RW]]
-# CHECK: 0120-0158	         56		[LOAD #4 [RW]]
-# CHECK: 0158-0190	         56		[LOAD #5 [R]]
-# CHECK: 0190-01a0	         16		.init
-# CHECK: 01a0-09f9	       2137		.text
-# CHECK: 09f9-0a00	          7		.fini
-# CHECK: 0a00-0d20	        800		.rodata
-# CHECK: 0d20-0d50	         48		.eh_frame
-# CHECK: 0d50-0d58	          8		.init_array
-# CHECK: 0d58-0d60	          8		.fini_array
-# CHECK: 0d60-0d68	          8		.got
-# CHECK: 0d68-0d80	         24		.got.plt
-# CHECK: 0d80-0f78	        504		.data
-# CHECK: 0f78-0f80	          8		.data
-# CHECK: 0f80-0fd8	         88		.comment
-# CHECK: 0fd8-1710	       1848		.symtab
-# CHECK: 1710-1a43	        819		.strtab
-# CHECK: 1a43-1ac0	        125		.shstrtab
-# CHECK: 1ac0-1b00	         64		[ELF Headers]
-# CHECK: 1b00-1b40	         64		.init
-# CHECK: 1b40-1b80	         64		.text
-# CHECK: 1b80-1bc0	         64		.fini
-# CHECK: 1bc0-1c00	         64		.rodata
-# CHECK: 1c00-1c40	         64		.eh_frame
-# CHECK: 1c40-1c80	         64		.init_array
-# CHECK: 1c80-1cc0	         64		.fini_array
-# CHECK: 1cc0-1d00	         64		.got
-# CHECK: 1d00-1d40	         64		.got.plt
-# CHECK: 1d40-1d80	         64		.data
-# CHECK: 1d80-1dc0	         64		.bss
-# CHECK: 1dc0-1e00	         64		.comment
-# CHECK: 1e00-1e40	         64		.symtab
-# CHECK: 1e40-1e80	         64		.strtab
-# CHECK: 1e80-1ec0	         64		.shstrtab
+# CHECK: 0000-0040	         64		[Unmapped]	[ELF Header]
+# CHECK: 0040-0190	        336		[Unmapped]	[ELF Program Headers]
+# CHECK: 0190-01a0	         16		LOAD #1 [RX]	.init
+# CHECK: 01a0-09f9	       2137		LOAD #1 [RX]	.text
+# CHECK: 09f9-0a00	          7		LOAD #1 [RX]	.fini
+# CHECK: 0a00-0d20	        800		LOAD #2 [R]	.rodata
+# CHECK: 0d20-0d50	         48		LOAD #2 [R]	.eh_frame
+# CHECK: 0d50-0d58	          8		LOAD #3 [RW]	.init_array
+# CHECK: 0d58-0d60	          8		LOAD #3 [RW]	.fini_array
+# CHECK: 0d60-0d68	          8		LOAD #3 [RW]	.got
+# CHECK: 0d68-0d80	         24		LOAD #3 [RW]	.got.plt
+# CHECK: 0d80-0f78	        504		LOAD #3 [RW]	.data
+# CHECK: 0f78-0f80	          8		[Unmapped]	.data
+# CHECK: 0f80-0fd8	         88		[Unmapped]	.comment
+# CHECK: 0fd8-1710	       1848		[Unmapped]	.symtab
+# CHECK: 1710-1a43	        819		[Unmapped]	.strtab
+# CHECK: 1a43-1ac0	        125		[Unmapped]	.shstrtab
+# CHECK: 1ac0-1ec0	       1024		[Unmapped]	[ELF Section Headers]
 
 # CHECK: VM MAP:
 # CHECK: 000000-401000	    4198400		[-- Nothing mapped --]
-# CHECK: 401000-401010	         16		.init
-# CHECK: 401010-401869	       2137		.text
-# CHECK: 401869-40186c	          3		.fini
+# CHECK: 401000-401010	         16		LOAD #1 [RX]	.init
+# CHECK: 401010-401869	       2137		LOAD #1 [RX]	.text
+# CHECK: 401869-40186c	          3		LOAD #1 [RX]	.fini
 # CHECK: 40186c-402000	       1940		[-- Nothing mapped --]
-# CHECK: 402000-402320	        800		.rodata
-# CHECK: 402320-402350	         48		.eh_frame
+# CHECK: 402000-402320	        800		LOAD #2 [R]	.rodata
+# CHECK: 402320-402350	         48		LOAD #2 [R]	.eh_frame
 # CHECK: 402350-403fe8	       7320		[-- Nothing mapped --]
-# CHECK: 403fe8-403ff0	          8		.init_array
-# CHECK: 403ff0-403ff8	          8		.fini_array
-# CHECK: 403ff8-404000	          8		.got
-# CHECK: 404000-404020	         32		.got.plt
-# CHECK: 404020-404220	        512		.data
-# CHECK: 404220-4044f8	        728		.bss
+# CHECK: 403fe8-403ff0	          8		LOAD #3 [RW]	.init_array
+# CHECK: 403ff0-403ff8	          8		LOAD #3 [RW]	.fini_array
+# CHECK: 403ff8-404000	          8		LOAD #3 [RW]	.got
+# CHECK: 404000-404020	         32		LOAD #3 [RW]	.got.plt
+# CHECK: 404020-404220	        512		LOAD #3 [RW]	.data
+# CHECK: 404220-4044f8	        728		LOAD #3 [RW]	.bss
diff --git a/tests/elf/sections/normal-obj.test b/tests/elf/sections/normal-obj.test
index f481b1a..15d563d 100644
--- a/tests/elf/sections/normal-obj.test
+++ b/tests/elf/sections/normal-obj.test
@@ -87,7 +87,7 @@
 ...
 
 # CHECK: FILE MAP:
-# CHECK: 000-040	         64		[ELF Headers]
+# CHECK: 000-040	         64		[ELF Header]
 # CHECK: 040-050	         16		.text
 # CHECK: 050-220	        464		.data
 # CHECK: 220-535	        789		.rodata
@@ -97,19 +97,7 @@
 # CHECK: 5a8-650	        168		.symtab
 # CHECK: 650-66b	         27		.strtab
 # CHECK: 66b-6d8	        109		.shstrtab
-# CHECK: 6d8-718	         64		[ELF Headers]
-# CHECK: 718-758	         64		.text
-# CHECK: 758-798	         64		.bss
-# CHECK: 798-7d8	         64		.data
-# CHECK: 7d8-818	         64		.rodata
-# CHECK: 818-858	         64		.comment
-# CHECK: 858-898	         64		.note.GNU-stack
-# CHECK: 898-8d8	         64		.eh_frame
-# CHECK: 8d8-918	         64		.rela.eh_frame
-# CHECK: 918-958	         64		.llvm_addrsig
-# CHECK: 958-998	         64		.symtab
-# CHECK: 998-9d8	         64		.strtab
-# CHECK: 9d8-a18	         64		.shstrtab
+# CHECK: 6d8-a18	        832		[ELF Section Headers]
 
 # CHECK: VM MAP:
 # CHECK: 00000000000-10000000000	 1099511627776		[-- Nothing mapped --]
diff --git a/tests/elf/sections/shn-xindex.test b/tests/elf/sections/shn-xindex.test
index 396f33d..2d85e15 100644
--- a/tests/elf/sections/shn-xindex.test
+++ b/tests/elf/sections/shn-xindex.test
@@ -25,11 +25,9 @@
 ...
 
 # CHECK: FILE MAP:
-# CHECK: 000-040	         64		[ELF Headers]
+# CHECK: 000-040	         64		[ELF Header]
 # CHECK: 040-041	          1		.strtab
 # CHECK: 041-058	         23		.shstrtab
-# CHECK: 058-098	         64		[ELF Headers]
-# CHECK: 098-0d8	         64		.strtab
-# CHECK: 0d8-118	         64		.shstrtab
+# CHECK: 058-118	        192		[ELF Section Headers]
 
 # CHECK: VM MAP: