Author: labath Date: Tue Dec 18 07:56:45 2018 New Revision: 349498 URL: http://llvm.org/viewvc/llvm-project?rev=349498&view=rev Log: 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 Modified: lldb/trunk/lit/Modules/ELF/many-sections.s lldb/trunk/lit/Modules/MachO/subsections.yaml lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.h lldb/trunk/tools/lldb-test/lldb-test.cpp Modified: lldb/trunk/lit/Modules/ELF/many-sections.s URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/Modules/ELF/many-sections.s?rev=349498&r1=349497&r2=349498&view=diff ============================================================================== --- lldb/trunk/lit/Modules/ELF/many-sections.s (original) +++ lldb/trunk/lit/Modules/ELF/many-sections.s Tue Dec 18 07:56:45 2018 @@ -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 Modified: lldb/trunk/lit/Modules/MachO/subsections.yaml URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/Modules/MachO/subsections.yaml?rev=349498&r1=349497&r2=349498&view=diff ============================================================================== --- lldb/trunk/lit/Modules/MachO/subsections.yaml (original) +++ lldb/trunk/lit/Modules/MachO/subsections.yaml Tue Dec 18 07:56:45 2018 @@ -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 Modified: lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp?rev=349498&r1=349497&r2=349498&view=diff ============================================================================== --- lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp (original) +++ lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp Tue Dec 18 07:56:45 2018 @@ -889,11 +889,11 @@ AddressClass ObjectFileELF::GetAddressCl } 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 @@ size_t ObjectFileELF::ParseDependentModu 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 @@ size_t ObjectFileELF::ParseSectionHeader 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 @@ void ObjectFileELF::CreateSections(Secti 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 @@ unsigned ObjectFileELF::ParseSymbols(Sym 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 @@ unsigned ObjectFileELF::ParseSymbols(Sym 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 @@ unsigned ObjectFileELF::ParseSymbols(Sym // 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 @@ unsigned ObjectFileELF::ParseSymbolTable 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 @@ ObjectFileELF::ParseTrampolineSymbols(Sy 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 @@ ObjectFileELF::ParseTrampolineSymbols(Sy 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 @@ unsigned ObjectFileELF::RelocateDebugSec 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) Modified: lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.h?rev=349498&r1=349497&r2=349498&view=diff ============================================================================== --- lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.h (original) +++ lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.h Tue Dec 18 07:56:45 2018 @@ -220,10 +220,10 @@ private: /// 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. Modified: lldb/trunk/tools/lldb-test/lldb-test.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-test/lldb-test.cpp?rev=349498&r1=349497&r2=349498&view=diff ============================================================================== --- lldb/trunk/tools/lldb-test/lldb-test.cpp (original) +++ lldb/trunk/tools/lldb-test/lldb-test.cpp Tue Dec 18 07:56:45 2018 @@ -732,6 +732,7 @@ static void dumpSectionList(LinePrinter 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())); _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits