@@ -319,6 +319,17 @@ - (CDLCSegment *)segmentContainingAddress:(NSUInteger)address;
319319 return nil ;
320320}
321321
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+
322333- (void )showWarning : (NSString *)warning ;
323334{
324335 NSLog (@" Warning: %@ " , warning);
@@ -356,7 +367,8 @@ - (NSString *)stringAtAddress:(NSUInteger)address;
356367 CDSection *section = [segment sectionContainingAddress: address];
357368 if ([[section sectionName ] isEqualToString: @" __objc_selrefs" ]) {
358369 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];
360372 }
361373
362374 ptr = (uint8_t *)[self .data bytes ] + offset;
@@ -383,6 +395,25 @@ - (NSUInteger)dataOffsetForAddress:(NSUInteger)address;
383395 return [segment fileOffsetForAddress: address];
384396}
385397
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+
386417- (const void *)bytes ;
387418{
388419 return [self .data bytes ];
0 commit comments