MCPcopy
hub / github.com/DerekSelander/LLDB / getLINKEDITData

Function getLINKEDITData

lldb_commands/ds.py:337–438  ·  view source on GitHub ↗
(section)

Source from the content-addressed store, hash-verified

335 return (indeces, stringList)
336
337def getLINKEDITData(section):
338 addr = section.addr
339 module = addr.GetModule()
340 target = getTarget()
341 fileHeaderAddr = module.GetObjectFileHeaderAddress().GetLoadAddress(target)
342
343 LINKEDITAddr = section.GetLoadAddress(target)
344 indeces = []
345 stringList = []
346
347 script = generateMachOHeaders()
348 script += 'uintptr_t baseAddress = (uintptr_t){};\n'.format(fileHeaderAddr)
349 # script += 'uintptr_t linkeditAddress = (uintptr_t){};\n'.format(LINKEDITAddr)
350 script += r'''
351
352@import Foundation;
353ds_symtab_command *symtab_cmd = NULL;
354ds_dysymtab_command *dysymtab_cmd = NULL;
355char *strtab = NULL;
356
357ds_header *dsheader = (ds_header *)baseAddress;
358ds_section *la_section = NULL;
359
360ds_segment *cur_seg = NULL;
361ds_segment *linkeditSegment = NULL;
362struct nlist_64 *symtab = NULL;
363uintptr_t pagezero = 0;
364
365uintptr_t cur = baseAddress + sizeof(ds_header);
366for (int i = 0; i < dsheader->ncmds; i++, cur += cur_seg->cmdsize) {
367 cur_seg = (ds_segment *)cur;
368 if (cur_seg->cmd == 0x2) { // LC_SYMTAB
369 symtab_cmd = (ds_symtab_command *)cur_seg;
370
371 } else if (cur_seg->cmd == 0xb) { // LC_DYSYMTAB
372 dysymtab_cmd = (ds_dysymtab_command *)cur_seg;
373 }
374 else if (cur_seg->cmd == 0x19 && strcmp(cur_seg->segname, "__LINKEDIT") == 0) {
375 // pagezero = cur_seg->vmsize;
376 linkeditSegment = cur_seg;
377 }
378 else if (cur_seg->cmd == 0x19 && strcmp(cur_seg->segname, "__PAGEZERO") == 0) {
379 pagezero = cur_seg->vmsize;
380 }
381}
382
383strtab = (char *)(symtab_cmd->stroff + baseAddress + linkeditSegment->vmaddr - linkeditSegment->fileoff - pagezero);
384symtab = (struct nlist_64 *)(symtab_cmd->symoff + baseAddress + linkeditSegment->vmaddr - linkeditSegment->fileoff - pagezero);
385uintptr_t linkedit_base = baseAddress + linkeditSegment->vmaddr - linkeditSegment->fileoff - pagezero;
386
387NSMutableString *returnString = [NSMutableString new];
388if (symtab_cmd) {
389 [returnString appendString:@"LC_SYMTAB\n"];
390 [returnString appendString:(id)[NSString stringWithFormat:@"\t[%012p] symtab (%d entries)\n", symtab, symtab_cmd->nsyms]];
391 [returnString appendString:(id)[NSString stringWithFormat:@"\t[%012p] strtab (size %d)\n", strtab, symtab_cmd->strsize]];
392}
393
394if (dysymtab_cmd) {

Callers 1

formatFromDataFunction · 0.85

Calls 3

getTargetFunction · 0.85
generateMachOHeadersFunction · 0.85
genExpressionOptionsFunction · 0.85

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…