aboutsummaryrefslogtreecommitdiff
path: root/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp')
-rw-r--r--lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp76
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);