bulbazord created this revision. bulbazord added reviewers: jasonmolenda, jingham, mib. Herald added a project: All. bulbazord requested review of this revision. Herald added a project: LLDB. Herald added a subscriber: lldb-commits.
I recently came across a binary that for some reason had overlapping sections. When debugging it, LLDB was able to get information about one of the sections but not the other because SectionLoadList assumes that each address maps to exactly one section. We have the capability to warn about this, but it was not turned on. rdar://105751700 Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D144528 Files: lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp Index: lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp =================================================================== --- lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp +++ lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp @@ -6182,6 +6182,10 @@ size_t num_loaded_sections = 0; const size_t num_sections = section_list->GetSize(); + // Warn if some top-level segments map to the same address. The binary may be + // malformed. + const bool warn_multiple = true; + if (value_is_offset) { // "value" is an offset to apply to each top level segment for (size_t sect_idx = 0; sect_idx < num_sections; ++sect_idx) { @@ -6190,7 +6194,8 @@ SectionSP section_sp(section_list->GetSectionAtIndex(sect_idx)); if (SectionIsLoadable(section_sp.get())) if (target.GetSectionLoadList().SetSectionLoadAddress( - section_sp, section_sp->GetFileAddress() + value)) + section_sp, section_sp->GetFileAddress() + value, + warn_multiple)) ++num_loaded_sections; } } else { @@ -6207,7 +6212,7 @@ value, mach_header_section, section_sp.get()); if (section_load_addr != LLDB_INVALID_ADDRESS) { if (target.GetSectionLoadList().SetSectionLoadAddress( - section_sp, section_load_addr)) + section_sp, section_load_addr, warn_multiple)) ++num_loaded_sections; } }
Index: lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp =================================================================== --- lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp +++ lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp @@ -6182,6 +6182,10 @@ size_t num_loaded_sections = 0; const size_t num_sections = section_list->GetSize(); + // Warn if some top-level segments map to the same address. The binary may be + // malformed. + const bool warn_multiple = true; + if (value_is_offset) { // "value" is an offset to apply to each top level segment for (size_t sect_idx = 0; sect_idx < num_sections; ++sect_idx) { @@ -6190,7 +6194,8 @@ SectionSP section_sp(section_list->GetSectionAtIndex(sect_idx)); if (SectionIsLoadable(section_sp.get())) if (target.GetSectionLoadList().SetSectionLoadAddress( - section_sp, section_sp->GetFileAddress() + value)) + section_sp, section_sp->GetFileAddress() + value, + warn_multiple)) ++num_loaded_sections; } } else { @@ -6207,7 +6212,7 @@ value, mach_header_section, section_sp.get()); if (section_load_addr != LLDB_INVALID_ADDRESS) { if (target.GetSectionLoadList().SetSectionLoadAddress( - section_sp, section_load_addr)) + section_sp, section_load_addr, warn_multiple)) ++num_loaded_sections; } }
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits