OpenCore  1.0.5
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 );
185 //
186 // Symbol->Section is implicitly verified by MachoGetSectionByIndex() when
187 // passed to it.
188 //
189 if (Symbol->UnifiedName.StringIndex >= Context->Symtab->StringsSize) {
190 return FALSE;
191 }
192
193 return TRUE;
194}
195
196BOOLEAN
199 )(
200 IN OUT OC_MACHO_CONTEXT *Context,
201 IN MACH_UINT_X Address,
202 OUT UINT32 *FileOffset,
203 OUT UINT32 *MaxSize OPTIONAL
204 ) {
205 MACH_UINT_X Offset;
206 MACH_UINT_X Base;
208 MACH_SEGMENT_COMMAND_X *Segment;
209
210 ASSERT (Context != NULL);
211 ASSERT (FileOffset != NULL);
212 MACH_ASSERT_X (Context);
213
214 for (
215 Segment = MACH_X (MachoGetNextSegment)(Context, NULL);
216 Segment != NULL;
217 Segment = MACH_X (MachoGetNextSegment)(Context, Segment)
218 )
219 {
220 if ( (Address >= Segment->VirtualAddress)
221 && (Address < (Segment->VirtualAddress + Segment->Size)))
222 {
223 break;
224 }
225 }
226
227 if (Segment == NULL) {
228 return FALSE;
229 }
230
231 Offset = Address - Segment->VirtualAddress;
232 Base = Segment->FileOffset;
233 Size = Segment->Size;
234
235 *FileOffset = MACH_X_TO_UINT32 (Base + Offset);
236
237 if (MaxSize != NULL) {
238 *MaxSize = MACH_X_TO_UINT32 (Size - Offset);
239 }
240
241 return TRUE;
242}
243
244BOOLEAN
247 )(
248 IN OUT OC_MACHO_CONTEXT *Context,
249 IN CONST MACH_NLIST_X *Symbol
250 ) {
251 CONST MACH_SEGMENT_COMMAND_X *Segment;
252
253 ASSERT (Context != NULL);
254 ASSERT (Symbol != NULL);
255 MACH_ASSERT_X (Context);
256
257 if (MACH_X (MachoSymbolIsLocalDefined)(Context, Symbol)) {
258 for (
259 Segment = MACH_X (MachoGetNextSegment)(Context, NULL);
260 Segment != NULL;
261 Segment = MACH_X (MachoGetNextSegment)(Context, Segment)
262 )
263 {
264 if ( (Symbol->Value >= Segment->VirtualAddress)
265 && (Symbol->Value < (Segment->VirtualAddress + Segment->Size)))
266 {
267 return TRUE;
268 }
269 }
270
271 return FALSE;
272 }
273
274 return TRUE;
275}
276
277BOOLEAN
280 )(
281 IN CONST MACH_NLIST_X *Symbol
282 ) {
283 ASSERT (Symbol != NULL);
284 return (InternalSymbolIsSectionType (Symbol) && (Symbol->Section != NO_SECT));
285}
286
287BOOLEAN
290 )(
291 IN CONST MACH_NLIST_X *Symbol
292 ) {
293 ASSERT (Symbol != NULL);
294
295 return ( ((Symbol->Type & MACH_N_TYPE_STAB) == 0)
296 && ( ((Symbol->Type & MACH_N_TYPE_TYPE) == MACH_N_TYPE_ABS)
297 || InternalSymbolIsSectionType (Symbol)));
298}
299
300BOOLEAN
303 )(
304 IN OUT OC_MACHO_CONTEXT *Context,
305 IN CONST MACH_NLIST_X *Symbol
306 ) {
307 CONST MACH_DYSYMTAB_COMMAND *DySymtab;
308 CONST MACH_NLIST_X *UndefinedSymbols;
309 CONST MACH_NLIST_X *UndefinedSymbolsTop;
310
311 #ifdef SOLVE_INDR
312 CONST MACH_NLIST_X *ExternalSymbols;
313 CONST MACH_NLIST_X *ExternalSymbolsTop;
314 #endif
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 #ifdef SOLVE_INDR
340 //
341 // If a symbol is marked as external, but is outside the external symbol
342 // range, it is likely a resolved indirect symbol.
343 //
344 if (Symbol->Type == (MACH_N_TYPE_ABS | MACH_N_TYPE_EXT)) {
345 ExternalSymbols = &(MACH_X (&Context->SymbolTable->Symbol))[DySymtab->ExternalSymbolsIndex];
346 ExternalSymbolsTop = &ExternalSymbols[DySymtab->NumExternalSymbols];
347
348 if (!((Symbol >= ExternalSymbols) && (Symbol < ExternalSymbolsTop))) {
349 return FALSE;
350 }
351 }
352
353 #endif
354
355 return MACH_X (MachoSymbolIsDefined)(Symbol);
356}
357
361 )(
362 IN OUT OC_MACHO_CONTEXT *Context,
363 IN UINT32 Index
364 ) {
365 MACH_NLIST_X *Symbol;
366
367 ASSERT (Context != NULL);
368 MACH_ASSERT_X (Context);
369
370 if (!InternalRetrieveSymtabs (Context)) {
371 return NULL;
372 }
373
374 ASSERT (Context->SymbolTable != NULL);
375
376 if (Index < Context->Symtab->NumSymbols) {
377 Symbol = &(MACH_X (&Context->SymbolTable->Symbol))[Index];
378 if (MACH_X (InternalSymbolIsSane)(Context, Symbol)) {
379 return Symbol;
380 }
381 }
382
383 return NULL;
384}
385
386CONST CHAR8 *
389 )(
390 IN OUT OC_MACHO_CONTEXT *Context,
391 IN CONST MACH_NLIST_X *Symbol
392 ) {
393 ASSERT (Context != NULL);
394 ASSERT (Symbol != NULL);
395 MACH_ASSERT_X (Context);
396
397 ASSERT (Context->SymbolTable != NULL);
398 ASSERT (Context->Symtab->StringsSize > Symbol->UnifiedName.StringIndex);
399
400 return (Context->StringTable + Symbol->UnifiedName.StringIndex);
401}
402
403CONST CHAR8 *
406 )(
407 IN OUT OC_MACHO_CONTEXT *Context,
408 IN CONST MACH_NLIST_X *Symbol
409 ) {
410 ASSERT (Context != NULL);
411 ASSERT (Symbol != NULL);
412 MACH_ASSERT_X (Context);
413
414 ASSERT (Context->SymbolTable != NULL);
415
416 if ( ((Symbol->Type & MACH_N_TYPE_STAB) != 0)
417 || ((Symbol->Type & MACH_N_TYPE_TYPE) != MACH_N_TYPE_INDR))
418 {
419 return NULL;
420 }
421
422 if (Context->Symtab->StringsSize <= Symbol->Value) {
423 return NULL;
424 }
425
426 return (Context->StringTable + Symbol->Value);
427}
428
429BOOLEAN
432 )(
433 IN OUT OC_MACHO_CONTEXT *Context,
434 IN MACH_UINT_X Address,
435 OUT MACH_NLIST_X **Symbol
436 ) {
437 if (Address >= MachoGetFileSize (Context)) {
438 return FALSE;
439 }
440
442 Context,
443 Address,
444 Symbol
445 );
446}
447
448BOOLEAN
451 )(
452 IN OUT OC_MACHO_CONTEXT *Context,
453 IN MACH_UINT_X Address,
454 OUT MACH_NLIST_X **Symbol
455 ) {
456 BOOLEAN Result;
457 CONST MACH_RELOCATION_INFO *Relocation;
458 CONST MACH_UINT_X *Data;
459 MACH_NLIST_X *Sym;
460 MACH_UINT_X AddressTop;
461 UINT32 MaxSize;
462
463 VOID *Tmp;
464
465 ASSERT (Context != NULL);
466 MACH_ASSERT_X (Context);
467
468 Result = MACH_X (BaseOverflowAddU)(Address, sizeof (MACH_UINT_X), &AddressTop);
469 if (Result || (AddressTop > MachoGetFileSize (Context))) {
470 return FALSE;
471 }
472
474 Context,
475 Address,
476 Symbol
477 );
478 if (Result) {
479 return TRUE;
480 }
481
482 Relocation = InternalGetLocalRelocationByOffset (Context, Address);
483 if (Relocation != NULL) {
484 Sym = NULL;
485
486 Tmp = (VOID *)MachoGetFilePointerByAddress (Context, Address, &MaxSize);
487 if ((Tmp == NULL) || (MaxSize < sizeof (MACH_UINT_X))) {
488 return FALSE;
489 }
490
491 if (BASE_TYPE_ALIGNED (MACH_UINT_X, Tmp)) {
492 Data = (MACH_UINT_X *)Tmp;
493
494 // FIXME: Only C++ symbols.
495 Sym = MACH_X (InternalGetSymbolByValue)(Context, *Data);
496 if ((Sym != NULL) && !MACH_X (InternalSymbolIsSane)(Context, Sym)) {
497 Sym = NULL;
498 }
499 }
500
501 *Symbol = Sym;
502 return TRUE;
503 }
504
505 return FALSE;
506}
507
511 )(
512 IN OUT OC_MACHO_CONTEXT *Context,
513 IN CONST CHAR8 *Name
514 ) {
515 MACH_NLIST_X *SymbolTable;
516 CONST MACH_DYSYMTAB_COMMAND *DySymtab;
517 MACH_NLIST_X *Symbol;
518
519 ASSERT (Context != NULL);
520 ASSERT (Name != NULL);
521 MACH_ASSERT_X (Context);
522
523 if (!InternalRetrieveSymtabs (Context)) {
524 return NULL;
525 }
526
527 ASSERT (Context->SymbolTable != NULL);
528 SymbolTable = MACH_X (&Context->SymbolTable->Symbol);
529
530 DySymtab = Context->DySymtab;
531
532 if (DySymtab != NULL) {
534 Context,
535 &SymbolTable[DySymtab->LocalSymbolsIndex],
536 DySymtab->NumLocalSymbols,
537 Name
538 );
539 if (Symbol == NULL) {
541 Context,
542 &SymbolTable[DySymtab->ExternalSymbolsIndex],
543 DySymtab->NumExternalSymbols,
544 Name
545 );
546 }
547 } else {
548 ASSERT (Context->Symtab != NULL);
550 Context,
551 SymbolTable,
552 Context->Symtab->NumSymbols,
553 Name
554 );
555 }
556
557 return Symbol;
558}
559
560BOOLEAN
563 )(
564 IN OUT OC_MACHO_CONTEXT *Context,
565 IN MACH_UINT_X LinkAddress,
566 IN OUT MACH_NLIST_X *Symbol
567 ) {
568 CONST MACH_SECTION_X *Section;
569 MACH_UINT_X Value;
570 BOOLEAN Result;
571
572 ASSERT (Context != NULL);
573 ASSERT (Symbol != NULL);
574 MACH_ASSERT_X (Context);
575
576 //
577 // Symbols are relocated when they describe sections.
578 //
579 if (MACH_X (MachoSymbolIsSection)(Symbol)) {
580 Section = MACH_X (MachoGetSectionByIndex)(Context, (Symbol->Section - 1));
581 if (Section == NULL) {
582 return FALSE;
583 }
584
585 Value = ALIGN_VALUE (
586 (Section->Address + LinkAddress),
587 (MACH_UINT_X)(1U << Section->Alignment)
588 );
589 Value -= Section->Address;
590
591 //
592 // The overflow arithmetic functions are not used as an overflow within the
593 // ALIGN_VALUE addition and a subsequent "underflow" of the section address
594 // subtraction is valid, hence just verify whether the final result
595 // overflew.
596 //
597 if (Value < LinkAddress) {
598 return FALSE;
599 }
600
601 Result = MACH_X (BaseOverflowAddU)(Symbol->Value, Value, &Value);
602 if (Result) {
603 return FALSE;
604 }
605
606 Symbol->Value = Value;
607 }
608
609 return TRUE;
610}
611
612BOOLEAN
615 )(
616 IN OUT OC_MACHO_CONTEXT *Context,
617 IN CONST MACH_NLIST_X *Symbol,
618 OUT UINT32 *FileOffset,
619 OUT UINT32 *MaxSize OPTIONAL
620 ) {
621 MACH_UINT_X Offset;
622 MACH_UINT_X Base;
624 MACH_SEGMENT_COMMAND_X *Segment;
625 MACH_SECTION_X *Section;
626
627 ASSERT (Context != NULL);
628 ASSERT (Symbol != NULL);
629 ASSERT (FileOffset != NULL);
630 MACH_ASSERT_X (Context);
631
632 if (Symbol->Section == NO_SECT) {
633 return FALSE;
634 }
635
636 Section = MACH_X (MachoGetSectionByIndex)(
637 Context,
638 (Symbol->Section - 1)
639 );
640 if ((Section == NULL) || (Section->Size == 0)) {
641 for (
642 Segment = MACH_X (MachoGetNextSegment)(Context, NULL);
643 Segment != NULL;
644 Segment = MACH_X (MachoGetNextSegment)(Context, Segment)
645 )
646 {
647 if ( (Symbol->Value >= Segment->VirtualAddress)
648 && (Symbol->Value < (Segment->VirtualAddress + Segment->Size)))
649 {
650 break;
651 }
652 }
653
654 if (Segment == NULL) {
655 return FALSE;
656 }
657
658 Offset = Symbol->Value - Segment->VirtualAddress;
659 Base = Segment->FileOffset;
660 Size = Segment->Size;
661 } else {
662 if (Symbol->Value < Section->Address) {
663 return FALSE;
664 }
665
666 Offset = Symbol->Value - Section->Address;
667 Base = Section->Offset;
668 Size = Section->Size;
669 if (Offset > Section->Size) {
670 return FALSE;
671 }
672 }
673
674 *FileOffset = MACH_X_TO_UINT32 (Base + Offset);
675
676 if (MaxSize != NULL) {
677 *MaxSize = MACH_X_TO_UINT32 (Size - Offset);
678 }
679
680 return TRUE;
681}
#define MACH_N_FUN
procedure: name,,n_sect,linenumber,address
#define NO_SECT
symbol is not in any section
#define MACH_N_TYPE_EXT
#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:482
#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:588
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:563
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:511
CONST CHAR8 *MACH_X MachoGetIndirectSymbolName(IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_X *Symbol)
Definition SymbolsX.h:406
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:615
BOOLEAN MACH_X MachoGetSymbolByExternRelocationOffset(IN OUT OC_MACHO_CONTEXT *Context, IN MACH_UINT_X Address, OUT MACH_NLIST_X **Symbol)
Definition SymbolsX.h:432
BOOLEAN MACH_X MachoIsSymbolValueInRange(IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_X *Symbol)
Definition SymbolsX.h:247
MACH_NLIST_X *MACH_X MachoGetSymbolByIndex(IN OUT OC_MACHO_CONTEXT *Context, IN UINT32 Index)
Definition SymbolsX.h:361
BOOLEAN MACH_X MachoGetSymbolByRelocationOffset(IN OUT OC_MACHO_CONTEXT *Context, IN MACH_UINT_X Address, OUT MACH_NLIST_X **Symbol)
Definition SymbolsX.h:451
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:280
BOOLEAN MACH_X MachoSymbolIsLocalDefined(IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_X *Symbol)
Definition SymbolsX.h:303
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:199
BOOLEAN MACH_X MachoSymbolIsDefined(IN CONST MACH_NLIST_X *Symbol)
Definition SymbolsX.h:290
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:389
#define ASSERT(x)
Definition coder.h:55