ELF: Don't create sections for section header index 0
Summary:
The first section header does not define a real section. Instead it is
used for various elf extensions. This patch skips creation of a section
for index 0.
This has one furtunate side-effect, in that it allows us to use the section
header index as the Section ID (where 0 is also invalid). This way, we
can get rid of a lot of spurious +1s in the ObjectFileELF code.
Reviewers: clayborg, krytarowski, joerg, espindola
Subscribers: emaste, lldb-commits, arichardson
Differential Revision: https://reviews.llvm.org/D55757
git-svn-id: https://llvm.org/svn/llvm-project/lldb/trunk@349498 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lit/Modules/ELF/many-sections.s b/lit/Modules/ELF/many-sections.s
index a5e4aee..15d7e8f 100644
--- a/lit/Modules/ELF/many-sections.s
+++ b/lit/Modules/ELF/many-sections.s
@@ -7,7 +7,7 @@
## aaaaaaaa..dddddddd, plus a couple of standard ones (.strtab, etc.)
## Check the number is correct plus the names of a couple of chosen sections.
-# CHECK: Showing 65541 sections
+# CHECK: Showing 65540 sections
# CHECK: Name: aaaaaaaa
# CHECK: Name: bbbbbbbb
# CHECK: Name: cccccccc
diff --git a/lit/Modules/MachO/subsections.yaml b/lit/Modules/MachO/subsections.yaml
index 7509b78..a92ef41 100644
--- a/lit/Modules/MachO/subsections.yaml
+++ b/lit/Modules/MachO/subsections.yaml
@@ -3,6 +3,7 @@
#CHECK: Showing 2 sections
#CHECK-NEXT: Index: 0
+#CHECK-NEXT: ID: 0x100
#CHECK-NEXT: Name: __PAGEZERO
#CHECK-NEXT: Type: container
#CHECK-NEXT: Permissions: ---
@@ -13,6 +14,7 @@
#CHECK-NEXT: There are no subsections
#CHECK-EMPTY:
#CHECK-NEXT: Index: 1
+#CHECK-NEXT: ID: 0x200
#CHECK-NEXT: Name: __TEXT
#CHECK-NEXT: Type: container
#CHECK-NEXT: Permissions: r-x
@@ -22,6 +24,7 @@
#CHECK-NEXT: File size: 4096
#CHECK-NEXT: Showing 3 subsections
#CHECK-NEXT: Index: 0
+#CHECK-NEXT: ID: 0x1
#CHECK-NEXT: Name: __text
#CHECK-NEXT: Type: code
#CHECK-NEXT: Permissions: r-x
@@ -31,6 +34,7 @@
#CHECK-NEXT: File size: 22
#CHECK-EMPTY:
#CHECK-NEXT: Index: 1
+#CHECK-NEXT: ID: 0x2
#CHECK-NEXT: Name: __unwind_info
#CHECK-NEXT: Type: compact-unwind
#CHECK-NEXT: Permissions: r-x
@@ -40,6 +44,7 @@
#CHECK-NEXT: File size: 76
#CHECK-EMPTY:
#CHECK-NEXT: Index: 2
+#CHECK-NEXT: ID: 0x3
#CHECK-NEXT: Name: __eh_frame
#CHECK-NEXT: Type: eh-frame
#CHECK-NEXT: Permissions: r-x
diff --git a/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp b/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
index 601c35b..95685c2 100644
--- a/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
+++ b/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
@@ -889,11 +889,11 @@
}
size_t ObjectFileELF::SectionIndex(const SectionHeaderCollIter &I) {
- return std::distance(m_section_headers.begin(), I) + 1u;
+ return std::distance(m_section_headers.begin(), I);
}
size_t ObjectFileELF::SectionIndex(const SectionHeaderCollConstIter &I) const {
- return std::distance(m_section_headers.begin(), I) + 1u;
+ return std::distance(m_section_headers.begin(), I);
}
bool ObjectFileELF::ParseHeader() {
@@ -1081,7 +1081,7 @@
return 0;
// sh_link: section header index of string table used by entries in the
// section.
- Section *dynstr = section_list->FindSectionByID(header->sh_link + 1).get();
+ Section *dynstr = section_list->FindSectionByID(header->sh_link).get();
if (!dynstr)
return 0;
@@ -1717,10 +1717,10 @@
const ObjectFileELF::ELFSectionHeaderInfo *
ObjectFileELF::GetSectionHeaderByIndex(lldb::user_id_t id) {
- if (!id || !ParseSectionHeaders())
+ if (!ParseSectionHeaders())
return NULL;
- if (--id < m_section_headers.size())
+ if (id < m_section_headers.size())
return &m_section_headers[id];
return NULL;
@@ -1853,7 +1853,7 @@
m_sections_ap.reset(new SectionList());
VMAddressProvider address_provider(CalculateType());
- for (SectionHeaderCollIter I = m_section_headers.begin();
+ for (SectionHeaderCollIter I = std::next(m_section_headers.begin());
I != m_section_headers.end(); ++I) {
const ELFSectionHeaderInfo &header = *I;
@@ -1990,9 +1990,9 @@
SectionSP symbol_section_sp;
SymbolType symbol_type = eSymbolTypeInvalid;
- Elf64_Half section_idx = symbol.st_shndx;
+ Elf64_Half shndx = symbol.st_shndx;
- switch (section_idx) {
+ switch (shndx) {
case SHN_ABS:
symbol_type = eSymbolTypeAbsolute;
break;
@@ -2000,7 +2000,7 @@
symbol_type = eSymbolTypeUndefined;
break;
default:
- symbol_section_sp = section_list->GetSectionAtIndex(section_idx);
+ symbol_section_sp = section_list->FindSectionByID(shndx);
break;
}
@@ -2169,7 +2169,7 @@
// symbols. See above for more details.
uint64_t symbol_value = symbol.st_value + symbol_value_offset;
- if (symbol_section_sp == nullptr && section_idx == SHN_ABS &&
+ if (symbol_section_sp == nullptr && shndx == SHN_ABS &&
symbol.st_size != 0) {
// We don't have a section for a symbol with non-zero size. Create a new
// section for it so the address range covered by the symbol is also
@@ -2282,9 +2282,8 @@
assert(symtab_hdr->sh_type == SHT_SYMTAB ||
symtab_hdr->sh_type == SHT_DYNSYM);
- // sh_link: section header index of associated string table. Section ID's are
- // ones based.
- user_id_t strtab_id = symtab_hdr->sh_link + 1;
+ // sh_link: section header index of associated string table.
+ user_id_t strtab_id = symtab_hdr->sh_link;
Section *strtab = section_list->FindSectionByID(strtab_id).get();
if (symtab && strtab) {
@@ -2494,10 +2493,6 @@
if (!symtab_id || !plt_id)
return 0;
- // Section ID's are ones based;
- symtab_id++;
- plt_id++;
-
const ELFSectionHeaderInfo *plt_hdr = GetSectionHeaderByIndex(plt_id);
if (!plt_hdr)
return 0;
@@ -2523,7 +2518,7 @@
return 0;
// sh_link points to associated string table.
- Section *strtab = section_list->FindSectionByID(sym_hdr->sh_link + 1).get();
+ Section *strtab = section_list->FindSectionByID(sym_hdr->sh_link).get();
if (!strtab)
return 0;
@@ -2651,9 +2646,8 @@
if (!section_list)
return 0;
- // Section ID's are ones based.
- user_id_t symtab_id = rel_hdr->sh_link + 1;
- user_id_t debug_id = rel_hdr->sh_info + 1;
+ user_id_t symtab_id = rel_hdr->sh_link;
+ user_id_t debug_id = rel_hdr->sh_info;
const ELFSectionHeader *symtab_hdr = GetSectionHeaderByIndex(symtab_id);
if (!symtab_hdr)
diff --git a/source/Plugins/ObjectFile/ELF/ObjectFileELF.h b/source/Plugins/ObjectFile/ELF/ObjectFileELF.h
index 0ad4f42..2e6478a 100644
--- a/source/Plugins/ObjectFile/ELF/ObjectFileELF.h
+++ b/source/Plugins/ObjectFile/ELF/ObjectFileELF.h
@@ -220,10 +220,10 @@
/// The address class for each symbol in the elf file
FileAddressToAddressClassMap m_address_class_map;
- /// Returns a 1 based index of the given section header.
+ /// Returns the index of the given section header.
size_t SectionIndex(const SectionHeaderCollIter &I);
- /// Returns a 1 based index of the given section header.
+ /// Returns the index of the given section header.
size_t SectionIndex(const SectionHeaderCollConstIter &I) const;
// Parses the ELF program headers.
diff --git a/tools/lldb-test/lldb-test.cpp b/tools/lldb-test/lldb-test.cpp
index eee664b..d8f4472 100644
--- a/tools/lldb-test/lldb-test.cpp
+++ b/tools/lldb-test/lldb-test.cpp
@@ -732,6 +732,7 @@
assert(S);
AutoIndent Indent(Printer, 2);
Printer.formatLine("Index: {0}", I);
+ Printer.formatLine("ID: {0:x}", S->GetID());
Printer.formatLine("Name: {0}", S->GetName().GetStringRef());
Printer.formatLine("Type: {0}", S->GetTypeAsCString());
Printer.formatLine("Permissions: {0}", GetPermissionsAsCString(S->GetPermissions()));