@@ -139,12 +139,8 @@ class ReflectionContext
139
139
if (!Command)
140
140
return false ;
141
141
142
- // Read everything including the __TEXT segment.
143
- // Buf = this->getReader().readBytes(ImageStart, Command->vmsize);
144
- auto Start = reinterpret_cast <const char *>(Buf.get ());
145
-
146
- // Find the load command offset.
147
- auto loadCmdOffset = Start + Offset + sizeof (typename T::Header);
142
+ // Find the load command offset.
143
+ auto loadCmdOffset = ImageStart.getAddressData () + Offset + sizeof (typename T::Header);
148
144
149
145
// Read the load command.
150
146
auto LoadCmdAddress = reinterpret_cast <const char *>(loadCmdOffset);
@@ -159,49 +155,43 @@ class ReflectionContext
159
155
auto Sections = this ->getReader ().readBytes (
160
156
RemoteAddress (SectAddress), NumSect * sizeof (typename T::Section));
161
157
158
+ auto Slide = ImageStart.getAddressData () - Command->vmaddr ;
162
159
std::string Prefix = " __swift5" ;
163
160
uint64_t RangeStart = UINT64_MAX;
164
161
uint64_t RangeEnd = UINT64_MAX;
162
+ auto SectionsBuf = reinterpret_cast <const char *>(Sections.get ());
165
163
for (unsigned I = 0 ; I < NumSect; ++I) {
166
164
auto S = reinterpret_cast <typename T::Section *>(
167
- SectAddress + (I * sizeof (typename T::Section)));
165
+ SectionsBuf + (I * sizeof (typename T::Section)));
168
166
if (strncmp (S->sectname , Prefix.c_str (), strlen (Prefix.c_str ())) != 0 )
169
167
continue ;
170
168
if (RangeStart == UINT64_MAX && RangeEnd == UINT64_MAX) {
171
- RangeStart = S->addr ;
172
- RangeEnd = S->addr + S->size ;
169
+ RangeStart = S->addr + Slide ;
170
+ RangeEnd = S->addr + S->size + Slide ;
173
171
continue ;
174
172
}
175
- RangeStart = std::min (RangeStart, (uint64_t )S->addr );
176
- RangeEnd = std::max (RangeEnd, (uint64_t )(S->addr + S->size ));
173
+ RangeStart = std::min (RangeStart, (uint64_t )S->addr + Slide );
174
+ RangeEnd = std::max (RangeEnd, (uint64_t )(S->addr + S->size + Slide ));
177
175
}
178
-
176
+
179
177
if (RangeStart == UINT64_MAX && RangeEnd == UINT64_MAX)
180
178
return false ;
181
179
182
- auto Slide = ImageStart.getAddressData () - Command->vmaddr ;
183
180
auto SectBuf = this ->getReader ().readBytes (RemoteAddress (RangeStart),
184
181
RangeEnd - RangeStart);
185
182
186
183
auto findMachOSectionByName = [&](std::string Name)
187
184
-> std::pair<std::pair<const char *, const char *>, uint32_t > {
188
- auto cmdOffset = Start + Offset + sizeof (typename T::Header);
189
- auto SegCmd = reinterpret_cast <typename T::SegmentCmd *>(cmdOffset);
190
- auto SectAddress = reinterpret_cast <const char *>(cmdOffset) +
191
- sizeof (typename T::SegmentCmd);
192
- for (unsigned I = 0 ; I < SegCmd->nsects ; ++I) {
185
+ for (unsigned I = 0 ; I < NumSect; ++I) {
193
186
auto S = reinterpret_cast <typename T::Section *>(
194
- SectAddress + (I * sizeof (typename T::Section)));
187
+ SectionsBuf + (I * sizeof (typename T::Section)));
195
188
if (strncmp (S->sectname , Name.c_str (), strlen (Name.c_str ())) != 0 )
196
189
continue ;
197
- auto Slide = ImageStart.getAddressData () - Command->vmaddr ;
198
190
auto RemoteSecStart = S->addr + Slide;
199
- auto LocalSectBuf =
200
- this ->getReader ().readBytes (RemoteAddress (RemoteSecStart), S->size );
191
+ auto SectBufData = reinterpret_cast <const char *>(SectBuf.get ());
201
192
auto LocalSectStart =
202
- reinterpret_cast <const char *>(LocalSectBuf.get ());
203
- auto LocalSectEnd =
204
- reinterpret_cast <const char *>(LocalSectBuf.get ()) + S->size ;
193
+ reinterpret_cast <const char *>(SectBufData + RemoteSecStart - RangeStart);
194
+ auto LocalSectEnd = reinterpret_cast <const char *>(LocalSectStart + S->size );
205
195
return {{LocalSectStart, LocalSectEnd}, 0 };
206
196
}
207
197
return {{nullptr , nullptr }, 0 };
0 commit comments