Skip to content

Commit e360281

Browse files
committed
[lldb] Computer the slide when and apply it to each fileset's vm addr
Computer the slide when and apply it to each entry's vm addr when reading from memory. Differential revision: https://reviews.llvm.org/D132710
1 parent a869014 commit e360281

File tree

2 files changed

+17
-4
lines changed

2 files changed

+17
-4
lines changed

lldb/source/Plugins/ObjectContainer/Mach-O-Fileset/ObjectContainerMachOFileset.cpp

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -133,21 +133,35 @@ static llvm::Optional<mach_header> ParseMachOHeader(DataExtractor &data) {
133133

134134
static bool
135135
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) {
137138
lldb::offset_t offset = MachHeaderSizeFromMagic(header.magic);
139+
lldb::offset_t slide = 0;
138140
for (uint32_t i = 0; i < header.ncmds; ++i) {
139141
const lldb::offset_t load_cmd_offset = offset;
140142
load_command lc = {};
141143
if (data.GetU32(&offset, &lc.cmd, 2) == nullptr)
142144
break;
143145

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+
144156
if (lc.cmd == LC_FILESET_ENTRY) {
145157
fileset_entry_command entry;
146158
data.CopyData(load_cmd_offset, sizeof(fileset_entry_command), &entry);
147159
lldb::offset_t entry_id_offset = load_cmd_offset + entry.entry_id;
148160
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));
150163
}
164+
151165
offset = load_cmd_offset + lc.cmdsize;
152166
}
153167

@@ -198,7 +212,7 @@ bool ObjectContainerMachOFileset::ParseHeader() {
198212
m_data.SetData(data_sp);
199213
}
200214

201-
return ParseFileset(m_data, *header, m_entries);
215+
return ParseFileset(m_data, *header, m_entries, m_memory_addr);
202216
}
203217

204218
size_t ObjectContainerMachOFileset::GetModuleSpecifications(

lldb/source/Plugins/ObjectContainer/Mach-O-Fileset/ObjectContainerMachOFileset.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@ class ObjectContainerMachOFileset : public lldb_private::ObjectContainer {
7373
: vmaddr(vmaddr), fileoff(fileoff), id(id) {}
7474
uint64_t vmaddr;
7575
uint64_t fileoff;
76-
uint64_t slide;
7776
std::string id;
7877
};
7978

0 commit comments

Comments
 (0)