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: