@@ -133,21 +133,35 @@ static llvm::Optional<mach_header> ParseMachOHeader(DataExtractor &data) {
133
133
134
134
static bool
135
135
ParseFileset (DataExtractor &data, mach_header header,
136
- std::vector<ObjectContainerMachOFileset::Entry> &entries) {
136
+ std::vector<ObjectContainerMachOFileset::Entry> &entries,
137
+ llvm::Optional<lldb::addr_t > load_addr = llvm::None) {
137
138
lldb::offset_t offset = MachHeaderSizeFromMagic (header.magic );
139
+ lldb::offset_t slide = 0 ;
138
140
for (uint32_t i = 0 ; i < header.ncmds ; ++i) {
139
141
const lldb::offset_t load_cmd_offset = offset;
140
142
load_command lc = {};
141
143
if (data.GetU32 (&offset, &lc.cmd , 2 ) == nullptr )
142
144
break ;
143
145
146
+ // If we know the load address we can compute the slide.
147
+ if (load_addr) {
148
+ if (lc.cmd == llvm::MachO::LC_SEGMENT_64) {
149
+ segment_command_64 segment;
150
+ data.CopyData (load_cmd_offset, sizeof (segment_command_64), &segment);
151
+ if (llvm::StringRef (segment.segname ) == " __TEXT" )
152
+ slide = *load_addr - segment.vmaddr ;
153
+ }
154
+ }
155
+
144
156
if (lc.cmd == LC_FILESET_ENTRY) {
145
157
fileset_entry_command entry;
146
158
data.CopyData (load_cmd_offset, sizeof (fileset_entry_command), &entry);
147
159
lldb::offset_t entry_id_offset = load_cmd_offset + entry.entry_id ;
148
160
const char *id = data.GetCStr (&entry_id_offset);
149
- entries.emplace_back (entry.vmaddr , entry.fileoff , std::string (id));
161
+ entries.emplace_back (entry.vmaddr + slide, entry.fileoff ,
162
+ std::string (id));
150
163
}
164
+
151
165
offset = load_cmd_offset + lc.cmdsize ;
152
166
}
153
167
@@ -198,7 +212,7 @@ bool ObjectContainerMachOFileset::ParseHeader() {
198
212
m_data.SetData (data_sp);
199
213
}
200
214
201
- return ParseFileset (m_data, *header, m_entries);
215
+ return ParseFileset (m_data, *header, m_entries, m_memory_addr );
202
216
}
203
217
204
218
size_t ObjectContainerMachOFileset::GetModuleSpecifications (
0 commit comments