32 switch (Symbol->Type) {
89 ASSERT (Context->SymbolTable != NULL);
90 ASSERT (Context->Symtab != NULL);
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];
115 if (Relocation != NULL) {
139 IN UINT32 NumberOfSymbols,
144 CONST CHAR8 *TmpName;
146 ASSERT (SymbolTable != NULL);
149 for (Index = 0; Index < NumberOfSymbols; ++Index) {
159 if (AsciiStrCmp (Name, TmpName) == 0) {
160 return &SymbolTable[Index];
178 ASSERT (Context->SymbolTable != NULL);
179 ASSERT (Context->Symtab->NumSymbols > 0);
182 ( (Symbol >= &(
MACH_X (&Context->SymbolTable->Symbol))[0])
183 && (Symbol < &(
MACH_X (&Context->SymbolTable->Symbol))[Context->Symtab->NumSymbols]))
189 if (Symbol->UnifiedName.StringIndex >= Context->Symtab->StringsSize) {
202 OUT UINT32 *FileOffset,
203 OUT UINT32 *MaxSize OPTIONAL
211 ASSERT (FileOffset != NULL);
220 if ( (Address >= Segment->VirtualAddress)
221 && (Address < (Segment->VirtualAddress + Segment->Size)))
227 if (Segment == NULL) {
231 Offset = Address - Segment->VirtualAddress;
232 Base = Segment->FileOffset;
233 Size = Segment->Size;
237 if (MaxSize != NULL) {
264 if ( (Symbol->Value >= Segment->VirtualAddress)
265 && (Symbol->Value < (Segment->VirtualAddress + Segment->Size)))
320 DySymtab = Context->DySymtab;
321 ASSERT (Context->SymbolTable != NULL);
323 if ((DySymtab == NULL) || (DySymtab->NumUndefinedSymbols == 0)) {
332 UndefinedSymbols = &(
MACH_X (&Context->SymbolTable->Symbol))[DySymtab->UndefinedSymbolsIndex];
333 UndefinedSymbolsTop = &UndefinedSymbols[DySymtab->NumUndefinedSymbols];
335 if ((Symbol >= UndefinedSymbols) && (Symbol < UndefinedSymbolsTop)) {
345 ExternalSymbols = &(
MACH_X (&Context->SymbolTable->Symbol))[DySymtab->ExternalSymbolsIndex];
346 ExternalSymbolsTop = &ExternalSymbols[DySymtab->NumExternalSymbols];
348 if (!((Symbol >= ExternalSymbols) && (Symbol < ExternalSymbolsTop))) {
374 ASSERT (Context->SymbolTable != NULL);
376 if (Index < Context->Symtab->NumSymbols) {
377 Symbol = &(
MACH_X (&Context->SymbolTable->Symbol))[Index];
397 ASSERT (Context->SymbolTable != NULL);
398 ASSERT (Context->Symtab->StringsSize > Symbol->UnifiedName.StringIndex);
400 return (Context->StringTable + Symbol->UnifiedName.StringIndex);
414 ASSERT (Context->SymbolTable != NULL);
422 if (Context->Symtab->StringsSize <= Symbol->Value) {
426 return (Context->StringTable + Symbol->Value);
483 if (Relocation != NULL) {
487 if ((Tmp == NULL) || (MaxSize <
sizeof (
MACH_UINT_X))) {
527 ASSERT (Context->SymbolTable != NULL);
528 SymbolTable =
MACH_X (&Context->SymbolTable->Symbol);
530 DySymtab = Context->DySymtab;
532 if (DySymtab != NULL) {
535 &SymbolTable[DySymtab->LocalSymbolsIndex],
536 DySymtab->NumLocalSymbols,
539 if (Symbol == NULL) {
542 &SymbolTable[DySymtab->ExternalSymbolsIndex],
543 DySymtab->NumExternalSymbols,
548 ASSERT (Context->Symtab != NULL);
552 Context->Symtab->NumSymbols,
581 if (Section == NULL) {
585 Value = ALIGN_VALUE (
586 (Section->Address + LinkAddress),
589 Value -= Section->Address;
597 if (Value < LinkAddress) {
601 Result =
MACH_X (BaseOverflowAddU)(Symbol->Value, Value, &Value);
606 Symbol->Value = Value;
618 OUT UINT32 *FileOffset,
619 OUT UINT32 *MaxSize OPTIONAL
629 ASSERT (FileOffset != NULL);
632 if (Symbol->Section ==
NO_SECT) {
638 (Symbol->Section - 1)
640 if ((Section == NULL) || (Section->Size == 0)) {
647 if ( (Symbol->Value >= Segment->VirtualAddress)
648 && (Symbol->Value < (Segment->VirtualAddress + Segment->Size)))
654 if (Segment == NULL) {
658 Offset = Symbol->Value - Segment->VirtualAddress;
659 Base = Segment->FileOffset;
660 Size = Segment->Size;
662 if (Symbol->Value < Section->Address) {
666 Offset = Symbol->Value - Section->Address;
667 Base = Section->Offset;
668 Size = Section->Size;
669 if (Offset > Section->Size) {
676 if (MaxSize != NULL) {
#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_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
#define MACH_SEGMENT_COMMAND_X
#define MACH_X_TO_UINT32(a)
DMG_SIZE_DEVICE_PATH Size
UINT32 MachoGetFileSize(IN OUT OC_MACHO_CONTEXT *Context)
VOID * MachoGetFilePointerByAddress(IN OUT OC_MACHO_CONTEXT *Context, IN UINT64 Address, OUT UINT32 *MaxSize OPTIONAL)
MACH_SEGMENT_COMMAND_ANY * MachoGetNextSegment(IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_SEGMENT_COMMAND_ANY *Segment OPTIONAL)
MACH_SECTION_ANY * MachoGetSectionByIndex(IN OUT OC_MACHO_CONTEXT *Context, IN UINT32 Index)
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)
STATIC MACH_NLIST_X *MACH_X InternalGetSymbolByValue(IN OUT OC_MACHO_CONTEXT *Context, IN MACH_UINT_X Value)
BOOLEAN MACH_X InternalSymbolIsSane(IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_X *Symbol)
MACH_NLIST_X *MACH_X MachoGetLocalDefinedSymbolByName(IN OUT OC_MACHO_CONTEXT *Context, IN CONST CHAR8 *Name)
CONST CHAR8 *MACH_X MachoGetIndirectSymbolName(IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_X *Symbol)
STATIC BOOLEAN InternalSymbolIsSectionType(IN CONST MACH_NLIST_X *Symbol)
BOOLEAN MACH_X MachoSymbolGetFileOffset(IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_X *Symbol, OUT UINT32 *FileOffset, OUT UINT32 *MaxSize OPTIONAL)
BOOLEAN MACH_X MachoGetSymbolByExternRelocationOffset(IN OUT OC_MACHO_CONTEXT *Context, IN MACH_UINT_X Address, OUT MACH_NLIST_X **Symbol)
BOOLEAN MACH_X MachoIsSymbolValueInRange(IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_X *Symbol)
MACH_NLIST_X *MACH_X MachoGetSymbolByIndex(IN OUT OC_MACHO_CONTEXT *Context, IN UINT32 Index)
BOOLEAN MACH_X MachoGetSymbolByRelocationOffset(IN OUT OC_MACHO_CONTEXT *Context, IN MACH_UINT_X Address, OUT MACH_NLIST_X **Symbol)
STATIC MACH_NLIST_X * InternalGetLocalDefinedSymbolByNameWorker(IN OUT OC_MACHO_CONTEXT *Context, IN MACH_NLIST_X *SymbolTable, IN UINT32 NumberOfSymbols, IN CONST CHAR8 *Name)
BOOLEAN MACH_X MachoSymbolIsSection(IN CONST MACH_NLIST_X *Symbol)
BOOLEAN MACH_X MachoSymbolIsLocalDefined(IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_X *Symbol)
BOOLEAN MACH_X InternalMachoSymbolGetDirectFileOffset(IN OUT OC_MACHO_CONTEXT *Context, IN MACH_UINT_X Address, OUT UINT32 *FileOffset, OUT UINT32 *MaxSize OPTIONAL)
BOOLEAN MACH_X MachoSymbolIsDefined(IN CONST MACH_NLIST_X *Symbol)
STATIC BOOLEAN InternalGetSymbolByExternRelocationOffset(IN OUT OC_MACHO_CONTEXT *Context, IN MACH_UINT_X Address, OUT MACH_NLIST_X **Symbol)
CONST CHAR8 *MACH_X MachoGetSymbolName(IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_NLIST_X *Symbol)