OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
SymbolsX.h
Go to the documentation of this file.
1
15#include "MachoX.h"
16
23STATIC
24BOOLEAN
26 IN CONST MACH_NLIST_X *Symbol
27 )
28{
29 ASSERT (Symbol != NULL);
30
31 if ((Symbol->Type & MACH_N_TYPE_STAB) != 0) {
32 switch (Symbol->Type) {
33 //
34 // Labeled as MACH_N_sect in stab.h
35 //
36 case MACH_N_FUN:
37 case MACH_N_STSYM:
38 case MACH_N_LCSYM:
39 case MACH_N_BNSYM:
40 case MACH_N_SLINE:
41 case MACH_N_ENSYM:
42 case MACH_N_SO:
43 case MACH_N_SOL:
44 case MACH_N_ENTRY:
45 case MACH_N_ECOMM:
46 case MACH_N_ECOML:
47 //
48 // These are labeled as NO_SECT in stab.h, but they are actually
49 // section-based on OS X. We must mark them as such so they get
50 // relocated.
51 //
52 case MACH_N_RBRAC:
53 case MACH_N_LBRAC:
54 {
55 return TRUE;
56 }
57
58 default:
59 {
60 break;
61 }
62 }
63 } else if ((Symbol->Type & MACH_N_TYPE_TYPE) == MACH_N_TYPE_SECT) {
64 return TRUE;
65 }
66
67 return FALSE;
68}
69
79STATIC
83 )(
84 IN OUT OC_MACHO_CONTEXT *Context,
85 IN MACH_UINT_X Value
86 ) {
87 UINT32 Index;
88
89 ASSERT (Context->SymbolTable != NULL);
90 ASSERT (Context->Symtab != NULL);
91
92 for (Index = 0; Index < Context->Symtab->NumSymbols; ++Index) {
93 if ((MACH_X (&Context->SymbolTable->Symbol))[Index].Value == Value) {
94 return &(MACH_X (&Context->SymbolTable->Symbol))[Index];
95 }
96 }
97
98 return NULL;
99}
100
101STATIC
102BOOLEAN
104 IN OUT OC_MACHO_CONTEXT *Context,
105 IN MACH_UINT_X Address,
106 OUT MACH_NLIST_X **Symbol
107 )
108{
109 CONST MACH_RELOCATION_INFO *Relocation;
110
111 ASSERT (Context != NULL);
112 MACH_ASSERT_X (Context);
113
114 Relocation = InternalGetExternRelocationByOffset (Context, Address);
115 if (Relocation != NULL) {
116 *Symbol = MACH_X (MachoGetSymbolByIndex)(Context, Relocation->SymbolNumber);
117 return TRUE;
118 }
119
120 return FALSE;
121}
122
134STATIC
137 IN OUT OC_MACHO_CONTEXT *Context,
138 IN MACH_NLIST_X *SymbolTable,
139 IN UINT32 NumberOfSymbols,
140 IN CONST CHAR8 *Name
141 )
142{
143 UINT32 Index;
144 CONST CHAR8 *TmpName;
145
146 ASSERT (SymbolTable != NULL);
147 ASSERT (Name != NULL);
148
149 for (Index = 0; Index < NumberOfSymbols; ++Index) {
150 if (!MACH_X (InternalSymbolIsSane)(Context, &SymbolTable[Index])) {
151 break;
152 }
153
154 if (!MACH_X (MachoSymbolIsDefined)(&SymbolTable[Index])) {
155 continue;
156 }
157
158 TmpName = MACH_X (MachoGetSymbolName)(Context, &SymbolTable[Index]);
159 if (AsciiStrCmp (Name, TmpName) == 0) {
160 return &SymbolTable[Index];
161 }
162 }
163
164 return NULL;
165}
166
167BOOLEAN
170 )(
171 IN OUT OC_MACHO_CONTEXT *Context,
172 IN CONST MACH_NLIST_X *Symbol
173 ) {
174 ASSERT (Context != NULL);
175 ASSERT (Symbol != NULL);
176 MACH_ASSERT_X (Context);
177
178 ASSERT (Context->SymbolTable != NULL);
179 ASSERT (Context->Symtab->NumSymbols > 0);
180
181 ASSERT (
182 ( (Symbol >= &(MACH_X (&Context->SymbolTable->Symbol))[0])
183 && (Symbol < &(MACH_X (&Context->SymbolTable->Symbol))[Context->Symtab->NumSymbols]))
184 || ( (Context->DySymtab != NULL)
185 && (Symbol >= &(MACH_X (&Context->IndirectSymbolTable->Symbol))[0])
186 && (Symbol < &(MACH_X (&Context->IndirectSymbolTable->Symbol))[Context->DySymtab->NumIndirectSymbols]))
187 );
188 //
189 // Symbol->Section is implicitly verified by MachoGetSectionByIndex() when
190 // passed to it.
191 //
192 if (Symbol->UnifiedName.StringIndex >= Context->Symtab->StringsSize) {
193 return FALSE;
194 }
195
196 return TRUE;
197}
198
199BOOLEAN
202 )(
203 IN OUT OC_MACHO_CONTEXT *Context,
204 IN MACH_UINT_X Address,
205 OUT UINT32 *FileOffset,
206 OUT UINT32 *MaxSize OPTIONAL
207 ) {
208 MACH_UINT_X Offset;
209 MACH_UINT_X Base;
211 MACH_SEGMENT_COMMAND_X *Segment;
212
213 ASSERT (Context != NULL);
214 ASSERT (FileOffset != NULL);
215 MACH_ASSERT_X (Context);
216
217 for (
218 Segment = MACH_X (MachoGetNextSegment)(Context, NULL);
219 Segment != NULL;
220 Segment = MACH_X (MachoGetNextSegment)(Context, Segment)
221 )
222 {
223 if ( (Address >= Segment->VirtualAddress)
224 && (Address < (Segment->VirtualAddress + Segment->Size)))
225 {
226 break;
227 }
228 }
229
230 if (Segment == NULL) {
231 return FALSE;
232 }
233
234 Offset = Address - Segment->VirtualAddress;
235 Base = Segment->FileOffset;
236 Size = Segment->Size;
237
238 *FileOffset = MACH_X_TO_UINT32 (Base + Offset);
239
240 if (MaxSize != NULL) {
241 *MaxSize = MACH_X_TO_UINT32 (Size - Offset);
242 }
243
244 return TRUE;
245}
246
247BOOLEAN
250 )(
251 IN OUT OC_MACHO_CONTEXT *Context,
252 IN CONST MACH_NLIST_X *Symbol
253 ) {
254 CONST MACH_SEGMENT_COMMAND_X *Segment;
255
256 ASSERT (Context != NULL);
257 ASSERT (Symbol != NULL);
258 MACH_ASSERT_X (Context);
259
260 if (MACH_X (MachoSymbolIsLocalDefined)(Context, Symbol)) {
261 for (
262 Segment = MACH_X (MachoGetNextSegment)(Context, NULL);
263 Segment != NULL;
264 Segment = MACH_X (MachoGetNextSegment)(Context, Segment)
265 )
266 {
267 if ( (Symbol->Value >= Segment->VirtualAddress)
268 && (Symbol->Value < (Segment->VirtualAddress + Segment->Size)))
269 {
270 return TRUE;
271 }
272 }
273
274 return FALSE;
275 }
276
277 return TRUE;
278}
279
280BOOLEAN
283 )(
284 IN CONST MACH_NLIST_X *Symbol
285 ) {
286 ASSERT (Symbol != NULL);
287 return (InternalSymbolIsSectionType (Symbol) && (Symbol->Section != NO_SECT));
288}
289
290BOOLEAN
293 )(
294 IN CONST MACH_NLIST_X *Symbol
295 ) {
296 ASSERT (Symbol != NULL);
297
298 return ( ((Symbol->Type & MACH_N_TYPE_STAB) == 0)
299 && ( ((Symbol->Type & MACH_N_TYPE_TYPE) == MACH_N_TYPE_ABS)
300 || InternalSymbolIsSectionType (Symbol)));
301}
302
303BOOLEAN
306 )(
307 IN OUT OC_MACHO_CONTEXT *Context,
308 IN CONST MACH_NLIST_X *Symbol
309 ) {
310 CONST MACH_DYSYMTAB_COMMAND *DySymtab;
311 CONST MACH_NLIST_X *UndefinedSymbols;
312 CONST MACH_NLIST_X *UndefinedSymbolsTop;
313 CONST MACH_NLIST_X *IndirectSymbols;
314 CONST MACH_NLIST_X *IndirectSymbolsTop;
315
316 ASSERT (Context != NULL);
317 ASSERT (Symbol != NULL);
318 MACH_ASSERT_X (Context);
319
320 DySymtab = Context->DySymtab;
321 ASSERT (Context->SymbolTable != NULL);
322
323 if ((DySymtab == NULL) || (DySymtab->NumUndefinedSymbols == 0)) {
324 return FALSE; // FIXME: Required under 32-bit during vtable parent resolution, if using MH_OBJECT.
325 }
326
327 //
328 // The symbol must have been declared locally prior to solving. As there is
329 // no information on whether the symbol has been solved explicitely, check
330 // its storage location for Undefined or Indirect.
331 //
332 UndefinedSymbols = &(MACH_X (&Context->SymbolTable->Symbol))[DySymtab->UndefinedSymbolsIndex];
333 UndefinedSymbolsTop = &UndefinedSymbols[DySymtab->NumUndefinedSymbols];
334
335 if ((Symbol >= UndefinedSymbols) && (Symbol < UndefinedSymbolsTop)) {
336 return FALSE;
337 }
338
339 IndirectSymbols = MACH_X (&Context->IndirectSymbolTable->Symbol);
340 IndirectSymbolsTop = &IndirectSymbols[DySymtab->NumIndirectSymbols];
341
342 if ((Symbol >= IndirectSymbols) && (Symbol < IndirectSymbolsTop)) {
343 return FALSE;
344 }
345
346 return MACH_X (MachoSymbolIsDefined)(Symbol);
347}
348
352 )(
353 IN OUT OC_MACHO_CONTEXT *Context,
354 IN UINT32 Index
355 ) {
356 MACH_NLIST_X *Symbol;
357
358 ASSERT (Context != NULL);
359 MACH_ASSERT_X (Context);
360
361 if (!InternalRetrieveSymtabs (Context)) {
362 return NULL;
363 }
364
365 ASSERT (Context->SymbolTable != NULL);
366
367 if (Index < Context->Symtab->NumSymbols) {
368 Symbol = &(MACH_X (&Context->SymbolTable->Symbol))[Index];
369 if (MACH_X (InternalSymbolIsSane)(Context, Symbol)) {
370 return Symbol;
371 }
372 }
373
374 return NULL;
375}
376
377CONST CHAR8 *
380 )(
381 IN OUT OC_MACHO_CONTEXT *Context,
382 IN CONST MACH_NLIST_X *Symbol
383 ) {
384 ASSERT (Context != NULL);
385 ASSERT (Symbol != NULL);
386 MACH_ASSERT_X (Context);
387
388 ASSERT (Context->SymbolTable != NULL);
389 ASSERT (Context->Symtab->StringsSize > Symbol->UnifiedName.StringIndex);
390
391 return (Context->StringTable + Symbol->UnifiedName.StringIndex);
392}
393
394CONST CHAR8 *
397 )(
398 IN OUT OC_MACHO_CONTEXT *Context,
399 IN CONST MACH_NLIST_X *Symbol
400 ) {
401 ASSERT (Context != NULL);
402 ASSERT (Symbol != NULL);
403 MACH_ASSERT_X (Context);
404
405 ASSERT (Context->SymbolTable != NULL);
406
407 if ( ((Symbol->Type & MACH_N_TYPE_STAB) != 0)
408 || ((Symbol->Type & MACH_N_TYPE_TYPE) != MACH_N_TYPE_INDR))
409 {
410 return NULL;
411 }
412
413 if (Context->Symtab->StringsSize <= Symbol->Value) {
414 return NULL;
415 }
416
417 return (Context->StringTable + Symbol->Value);
418}
419
420BOOLEAN
423 )(
424 IN OUT OC_MACHO_CONTEXT *Context,
425 IN MACH_UINT_X Address,
426 OUT MACH_NLIST_X **Symbol
427 ) {
428 if (Address >= MachoGetFileSize (Context)) {
429 return FALSE;
430 }
431
433 Context,
434 Address,
435 Symbol
436 );
437}
438
439BOOLEAN
442 )(
443 IN OUT OC_MACHO_CONTEXT *Context,
444 IN MACH_UINT_X Address,
445 OUT MACH_NLIST_X **Symbol
446 ) {
447 BOOLEAN Result;
448 CONST MACH_RELOCATION_INFO *Relocation;
449 CONST MACH_UINT_X *Data;
450 MACH_NLIST_X *Sym;
451 MACH_UINT_X AddressTop;
452 UINT32 MaxSize;
453
454 VOID *Tmp;
455
456 ASSERT (Context != NULL);
457 MACH_ASSERT_X (Context);
458
459 Result = MACH_X (BaseOverflowAddU)(Address, sizeof (MACH_UINT_X), &AddressTop);
460 if (Result || (AddressTop > MachoGetFileSize (Context))) {
461 return FALSE;
462 }
463
465 Context,
466 Address,
467 Symbol
468 );
469 if (Result) {
470 return TRUE;
471 }
472
473 Relocation = InternalGetLocalRelocationByOffset (Context, Address);
474 if (Relocation != NULL) {
475 Sym = NULL;
476
477 Tmp = (VOID *)MachoGetFilePointerByAddress (Context, Address, &MaxSize);
478 if ((Tmp == NULL) || (MaxSize < sizeof (MACH_UINT_X))) {
479 return FALSE;
480 }
481
482 if (BASE_TYPE_ALIGNED (MACH_UINT_X, Tmp)) {
483 Data = (MACH_UINT_X *)Tmp;
484
485 // FIXME: Only C++ symbols.
486 Sym = MACH_X (InternalGetSymbolByValue)(Context, *Data);
487 if ((Sym != NULL) && !MACH_X (InternalSymbolIsSane)(Context, Sym)) {
488 Sym = NULL;
489 }
490 }
491
492 *Symbol = Sym;
493 return TRUE;
494 }
495
496 return FALSE;
497}
498
502 )(
503 IN OUT OC_MACHO_CONTEXT *Context,
504 IN CONST CHAR8 *Name
505 ) {
506 MACH_NLIST_X *SymbolTable;
507 CONST MACH_DYSYMTAB_COMMAND *DySymtab;
508 MACH_NLIST_X *Symbol;
509
510 ASSERT (Context != NULL);
511 ASSERT (Name != NULL);
512 MACH_ASSERT_X (Context);
513
514 if (!InternalRetrieveSymtabs (Context)) {
515 return NULL;
516 }
517
518 ASSERT (Context->SymbolTable != NULL);
519 SymbolTable = MACH_X (&Context->SymbolTable->Symbol);
520
521 DySymtab = Context->DySymtab;
522
523 if (DySymtab != NULL) {
525 Context,
526 &SymbolTable[DySymtab->LocalSymbolsIndex],
527 DySymtab->NumLocalSymbols,
528 Name
529 );
530 if (Symbol == NULL) {
532 Context,
533 &SymbolTable[DySymtab->ExternalSymbolsIndex],
534 DySymtab->NumExternalSymbols,
535 Name
536 );
537 }
538 } else {
539 ASSERT (Context->Symtab != NULL);
541 Context,
542 SymbolTable,
543 Context->Symtab->NumSymbols,
544 Name
545 );
546 }
547
548 return Symbol;
549}
550
551BOOLEAN
554 )(
555 IN OUT OC_MACHO_CONTEXT *Context,
556 IN MACH_UINT_X LinkAddress,
557 IN OUT MACH_NLIST_X *Symbol
558 ) {
559 CONST MACH_SECTION_X *Section;
560 MACH_UINT_X Value;
561 BOOLEAN Result;
562
563 ASSERT (Context != NULL);
564 ASSERT (Symbol != NULL);
565 MACH_ASSERT_X (Context);
566
567 //
568 // Symbols are relocated when they describe sections.
569 //
570 if (MACH_X (MachoSymbolIsSection)(Symbol)) {
571 Section = MACH_X (MachoGetSectionByIndex)(Context, (Symbol->Section - 1));
572 if (Section == NULL) {
573 return FALSE;
574 }
575
576 Value = ALIGN_VALUE (
577 (Section->Address + LinkAddress),
578 (MACH_UINT_X)(1U << Section->Alignment)
579 );
580 Value -= Section->Address;
581
582 //
583 // The overflow arithmetic functions are not used as an overflow within the
584 // ALIGN_VALUE addition and a subsequent "underflow" of the section address
585 // subtraction is valid, hence just verify whether the final result
586 // overflew.
587 //
588 if (Value < LinkAddress) {
589 return FALSE;
590 }
591
592 Result = MACH_X (BaseOverflowAddU)(Symbol->Value, Value, &Value);
593 if (Result) {
594 return FALSE;
595 }
596
597 Symbol->Value = Value;
598 }
599
600 return TRUE;
601}
602
603BOOLEAN
606 )(
607 IN OUT OC_MACHO_CONTEXT *Context,
608 IN CONST MACH_NLIST_X *Symbol,
609 OUT UINT32 *FileOffset,
610 OUT UINT32 *MaxSize OPTIONAL
611 ) {
612 MACH_UINT_X Offset;
613 MACH_UINT_X Base;
615 MACH_SEGMENT_COMMAND_X *Segment;
616 MACH_SECTION_X *Section;
617
618 ASSERT (Context != NULL);
619 ASSERT (Symbol != NULL);
620 ASSERT (FileOffset != NULL);
621 MACH_ASSERT_X (Context);
622
623 if (Symbol->Section == NO_SECT) {
624 return FALSE;
625 }
626
627 Section = MACH_X (MachoGetSectionByIndex)(
628 Context,
629 (Symbol->Section - 1)
630 );
631 if ((Section == NULL) || (Section->Size == 0)) {
632 for (
633 Segment = MACH_X (MachoGetNextSegment)(Context, NULL);
634 Segment != NULL;
635 Segment = MACH_X (MachoGetNextSegment)(Context, Segment)
636 )
637 {
638 if ( (Symbol->Value >= Segment->VirtualAddress)
639 && (Symbol->Value < (Segment->VirtualAddress + Segment->Size)))
640 {
641 break;
642 }
643 }
644
645 if (Segment == NULL) {
646 return FALSE;
647 }
648
649 Offset = Symbol->Value - Segment->VirtualAddress;
650 Base = Segment->FileOffset;
651 Size = Segment->Size;
652 } else {
653 if (Symbol->Value < Section->Address) {
654 return FALSE;
655 }
656
657 Offset = Symbol->Value - Section->Address;
658 Base = Section->Offset;
659 Size = Section->Size;
660 if (Offset > Section->Size) {
661 return FALSE;
662 }
663 }
664
665 *FileOffset = MACH_X_TO_UINT32 (Base + Offset);
666
667 if (MaxSize != NULL) {
668 *MaxSize = MACH_X_TO_UINT32 (Size - Offset);
669 }
670
671 return TRUE;
672}
#define MACH_N_FUN
procedure: name,,n_sect,linenumber,address
#define NO_SECT
symbol is not in any section
#define MACH_N_SOL
#included file name: name,,n_sect,0,address
#define MACH_N_SO
source file name: name,,n_sect,0,address
#define MACH_N_BNSYM
begin nsect sym: 0,,n_sect,0,address
#define MACH_N_STSYM
static symbol: name,,n_sect,type,address
#define MACH_N_TYPE_TYPE
mask for the type bit
#define MACH_N_TYPE_STAB
#define MACH_N_ECOML
end common (local name): 0,,n_sect,0,address
#define MACH_N_LCSYM
.lcomm symbol: name,,n_sect,type,address
#define MACH_N_TYPE_INDR
indirect
#define MACH_N_ENSYM
end nsect sym: 0,,n_sect,0,address
#define MACH_N_ENTRY
alternate entry: name,,n_sect,linenumber,address
#define MACH_N_RBRAC
right bracket: 0,,NO_SECT,nesting level,address
#define MACH_N_LBRAC
left bracket: 0,,NO_SECT,nesting level,address
#define MACH_N_TYPE_SECT
defined in section number n_sect
#define MACH_N_SLINE
src line: 0,,n_sect,linenumber,address
#define MACH_N_TYPE_ABS
absolute, n_sect == NO_SECT
#define MACH_N_ECOMM
end common: name,,n_sect,0,0
BOOLEAN InternalRetrieveSymtabs(IN OUT OC_MACHO_CONTEXT *Context)
Definition Header.c:508
#define MACH_ASSERT_X(a)
Definition MachoX.h:63
#define MACH_SEGMENT_COMMAND_X
Definition MachoX.h:57
#define MACH_UINT_X
Definition MachoX.h:54
#define MACH_X_TO_UINT32(a)
Definition MachoX.h:65
#define MACH_SECTION_X
Definition MachoX.h:56
#define MACH_NLIST_X
Definition MachoX.h:58
#define MACH_X(a)
Definition MachoX.h:62
DMG_SIZE_DEVICE_PATH Size
UINT32 MachoGetFileSize(IN OUT OC_MACHO_CONTEXT *Context)
Definition Header.c:77
VOID * MachoGetFilePointerByAddress(IN OUT OC_MACHO_CONTEXT *Context, IN UINT64 Address, OUT UINT32 *MaxSize OPTIONAL)
Definition Header.c:627
MACH_SEGMENT_COMMAND_ANY * MachoGetNextSegment(IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_SEGMENT_COMMAND_ANY *Segment OPTIONAL)
Definition Header.c:160
MACH_SECTION_ANY * MachoGetSectionByIndex(IN OUT OC_MACHO_CONTEXT *Context, IN UINT32 Index)
Definition Header.c:188
MACH_RELOCATION_INFO * InternalGetExternRelocationByOffset(IN OUT OC_MACHO_CONTEXT *Context, IN UINT64 Address)
MACH_RELOCATION_INFO * InternalGetLocalRelocationByOffset(IN OUT OC_MACHO_CONTEXT *Context, IN UINT64 Address)
BOOLEAN MACH_X MachoRelocateSymbol(IN OUT OC_MACHO_CONTEXT *Context, IN MACH_UINT_X LinkAddress, IN OUT MACH_NLIST_X *Symbol)
Definition SymbolsX.h:554
STATIC MACH_NLIST_X *MACH_X InternalGetSymbolByValue(IN OUT OC_MACHO_CONTEXT *Context, IN MACH_UINT_X Value)
Definition SymbolsX.h:83
BOOLEAN MACH_X InternalSymbolIsSane(IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_X *Symbol)
Definition SymbolsX.h:170
MACH_NLIST_X *MACH_X MachoGetLocalDefinedSymbolByName(IN OUT OC_MACHO_CONTEXT *Context, IN CONST CHAR8 *Name)
Definition SymbolsX.h:502
CONST CHAR8 *MACH_X MachoGetIndirectSymbolName(IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_X *Symbol)
Definition SymbolsX.h:397
STATIC BOOLEAN InternalSymbolIsSectionType(IN CONST MACH_NLIST_X *Symbol)
Definition SymbolsX.h:25
BOOLEAN MACH_X MachoSymbolGetFileOffset(IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_X *Symbol, OUT UINT32 *FileOffset, OUT UINT32 *MaxSize OPTIONAL)
Definition SymbolsX.h:606
BOOLEAN MACH_X MachoGetSymbolByExternRelocationOffset(IN OUT OC_MACHO_CONTEXT *Context, IN MACH_UINT_X Address, OUT MACH_NLIST_X **Symbol)
Definition SymbolsX.h:423
BOOLEAN MACH_X MachoIsSymbolValueInRange(IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_X *Symbol)
Definition SymbolsX.h:250
MACH_NLIST_X *MACH_X MachoGetSymbolByIndex(IN OUT OC_MACHO_CONTEXT *Context, IN UINT32 Index)
Definition SymbolsX.h:352
BOOLEAN MACH_X MachoGetSymbolByRelocationOffset(IN OUT OC_MACHO_CONTEXT *Context, IN MACH_UINT_X Address, OUT MACH_NLIST_X **Symbol)
Definition SymbolsX.h:442
STATIC MACH_NLIST_X * InternalGetLocalDefinedSymbolByNameWorker(IN OUT OC_MACHO_CONTEXT *Context, IN MACH_NLIST_X *SymbolTable, IN UINT32 NumberOfSymbols, IN CONST CHAR8 *Name)
Definition SymbolsX.h:136
BOOLEAN MACH_X MachoSymbolIsSection(IN CONST MACH_NLIST_X *Symbol)
Definition SymbolsX.h:283
BOOLEAN MACH_X MachoSymbolIsLocalDefined(IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_X *Symbol)
Definition SymbolsX.h:306
BOOLEAN MACH_X InternalMachoSymbolGetDirectFileOffset(IN OUT OC_MACHO_CONTEXT *Context, IN MACH_UINT_X Address, OUT UINT32 *FileOffset, OUT UINT32 *MaxSize OPTIONAL)
Definition SymbolsX.h:202
BOOLEAN MACH_X MachoSymbolIsDefined(IN CONST MACH_NLIST_X *Symbol)
Definition SymbolsX.h:293
STATIC BOOLEAN InternalGetSymbolByExternRelocationOffset(IN OUT OC_MACHO_CONTEXT *Context, IN MACH_UINT_X Address, OUT MACH_NLIST_X **Symbol)
Definition SymbolsX.h:103
CONST CHAR8 *MACH_X MachoGetSymbolName(IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_X *Symbol)
Definition SymbolsX.h:380
#define ASSERT(x)
Definition coder.h:55