@@ -319,6 +319,17 @@ - (CDLCSegment *)segmentContainingAddress:(NSUInteger)address;
319
319
return nil ;
320
320
}
321
321
322
+ - (CDLCSegment *)segmentContainingOffset : (NSUInteger )offset ;
323
+ {
324
+ for (id loadCommand in _loadCommands) {
325
+ if ([loadCommand isKindOfClass: [CDLCSegment class ]] && [loadCommand containsOffset: offset]) {
326
+ return loadCommand;
327
+ }
328
+ }
329
+
330
+ return nil ;
331
+ }
332
+
322
333
- (void )showWarning : (NSString *)warning ;
323
334
{
324
335
NSLog (@" Warning: %@ " , warning);
@@ -356,7 +367,8 @@ - (NSString *)stringAtAddress:(NSUInteger)address;
356
367
CDSection *section = [segment sectionContainingAddress: address];
357
368
if ([[section sectionName ] isEqualToString: @" __objc_selrefs" ]) {
358
369
const void * reference = [self .data bytes ] + offset;
359
- offset = ([self ptrSize ] == 8 ) ? *((uint64_t *)reference) : *((uint32_t *)reference);
370
+ NSUInteger vmaddr = ([self ptrSize ] == 8 ) ? *((uint64_t *)reference) : *((uint32_t *)reference);
371
+ offset = [self dataOffsetForAddress: vmaddr];
360
372
}
361
373
362
374
ptr = (uint8_t *)[self .data bytes ] + offset;
@@ -383,6 +395,25 @@ - (NSUInteger)dataOffsetForAddress:(NSUInteger)address;
383
395
return [segment fileOffsetForAddress: address];
384
396
}
385
397
398
+ - (NSUInteger )addressForDataOffset : (NSUInteger )offset
399
+ {
400
+ if (offset == 0 )
401
+ return 0 ;
402
+
403
+ CDLCSegment *segment = [self segmentContainingOffset: offset];
404
+ if (segment == nil ) {
405
+ NSLog (@" Error: Cannot find segment for data offset 0x%08lx in segmentContainingOffset:" , offset);
406
+ exit (5 );
407
+ }
408
+
409
+ if ([segment isProtected ]) {
410
+ NSLog (@" Error: Segment is protected." );
411
+ exit (5 );
412
+ }
413
+
414
+ return [segment addressForDataOffset: offset];
415
+ }
416
+
386
417
- (const void *)bytes ;
387
418
{
388
419
return [self .data bytes ];
0 commit comments