diff options
Diffstat (limited to 'lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp')
-rw-r--r-- | lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp | 76 |
1 files changed, 33 insertions, 43 deletions
diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp index 924e340..fada1fd 100644 --- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp +++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp @@ -2156,10 +2156,10 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) { LLDB_LOG(log, "Parsing symbol table for {0}", file_name); Progress progress("Parsing symbol table", file_name); - llvm::MachO::linkedit_data_command function_starts_load_command = {0, 0, 0, 0}; - llvm::MachO::linkedit_data_command exports_trie_load_command = {0, 0, 0, 0}; - llvm::MachO::dyld_info_command dyld_info = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - llvm::MachO::dysymtab_command dysymtab = m_dysymtab; + LinkeditDataCommandLargeOffsets function_starts_load_command; + LinkeditDataCommandLargeOffsets exports_trie_load_command; + DyldInfoCommandLargeOffsets dyld_info; + DysymtabCommandLargeOffsets dysymtab(m_dysymtab); SymtabCommandLargeOffsets symtab_load_command; // The data element of type bool indicates that this entry is thumb // code. @@ -2196,32 +2196,24 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) { break; // Watch for the symbol table load command switch (lc.cmd) { - case LC_SYMTAB: - // struct symtab_command { - // uint32_t cmd; /* LC_SYMTAB */ - // uint32_t cmdsize; /* sizeof(struct symtab_command) */ - // uint32_t symoff; /* symbol table offset */ - // uint32_t nsyms; /* number of symbol table entries */ - // uint32_t stroff; /* string table offset */ - // uint32_t strsize; /* string table size in bytes */ - // }; - symtab_load_command.cmd = lc.cmd; - symtab_load_command.cmdsize = lc.cmdsize; - symtab_load_command.symoff = m_data.GetU32(&offset); - symtab_load_command.nsyms = m_data.GetU32(&offset); - symtab_load_command.stroff = m_data.GetU32(&offset); - symtab_load_command.strsize = m_data.GetU32(&offset); - break; + case LC_SYMTAB: { + llvm::MachO::symtab_command lc_obj; + if (m_data.GetU32(&offset, &lc_obj.symoff, 4)) { + lc_obj.cmd = lc.cmd; + lc_obj.cmdsize = lc.cmdsize; + symtab_load_command = lc_obj; + } + } break; case LC_DYLD_INFO: - case LC_DYLD_INFO_ONLY: - if (m_data.GetU32(&offset, &dyld_info.rebase_off, 10)) { - dyld_info.cmd = lc.cmd; - dyld_info.cmdsize = lc.cmdsize; - } else { - memset(&dyld_info, 0, sizeof(dyld_info)); + case LC_DYLD_INFO_ONLY: { + llvm::MachO::dyld_info_command lc_obj; + if (m_data.GetU32(&offset, &lc_obj.rebase_off, 10)) { + lc_obj.cmd = lc.cmd; + lc_obj.cmdsize = lc.cmdsize; + dyld_info = lc_obj; } - break; + } break; case LC_LOAD_DYLIB: case LC_LOAD_WEAK_DYLIB: @@ -2245,22 +2237,20 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) { } } break; - case LC_DYLD_EXPORTS_TRIE: - exports_trie_load_command.cmd = lc.cmd; - exports_trie_load_command.cmdsize = lc.cmdsize; - if (m_data.GetU32(&offset, &exports_trie_load_command.dataoff, 2) == - nullptr) // fill in offset and size fields - memset(&exports_trie_load_command, 0, - sizeof(exports_trie_load_command)); - break; - case LC_FUNCTION_STARTS: - function_starts_load_command.cmd = lc.cmd; - function_starts_load_command.cmdsize = lc.cmdsize; - if (m_data.GetU32(&offset, &function_starts_load_command.dataoff, 2) == - nullptr) // fill in data offset and size fields - memset(&function_starts_load_command, 0, - sizeof(function_starts_load_command)); - break; + case LC_DYLD_EXPORTS_TRIE: { + llvm::MachO::linkedit_data_command lc_obj; + lc_obj.cmd = lc.cmd; + lc_obj.cmdsize = lc.cmdsize; + if (m_data.GetU32(&offset, &lc_obj.dataoff, 2)) + exports_trie_load_command = lc_obj; + } break; + case LC_FUNCTION_STARTS: { + llvm::MachO::linkedit_data_command lc_obj; + lc_obj.cmd = lc.cmd; + lc_obj.cmdsize = lc.cmdsize; + if (m_data.GetU32(&offset, &lc_obj.dataoff, 2)) + function_starts_load_command = lc_obj; + } break; case LC_UUID: { const uint8_t *uuid_bytes = m_data.PeekData(offset, 16); |