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]))
184 || ( (Context->DySymtab != NULL)
185 && (Symbol >= &(
MACH_X (&Context->IndirectSymbolTable->Symbol))[0])
186 && (Symbol < &(
MACH_X (&Context->IndirectSymbolTable->Symbol))[Context->DySymtab->NumIndirectSymbols]))
192 if (Symbol->UnifiedName.StringIndex >= Context->Symtab->StringsSize) {
205 OUT UINT32 *FileOffset,
206 OUT UINT32 *MaxSize OPTIONAL
214 ASSERT (FileOffset != NULL);
223 if ( (Address >= Segment->VirtualAddress)
224 && (Address < (Segment->VirtualAddress + Segment->Size)))
230 if (Segment == NULL) {
234 Offset = Address - Segment->VirtualAddress;
235 Base = Segment->FileOffset;
236 Size = Segment->Size;
240 if (MaxSize != NULL) {
267 if ( (Symbol->Value >= Segment->VirtualAddress)
268 && (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)) {
339 IndirectSymbols =
MACH_X (&Context->IndirectSymbolTable->Symbol);
340 IndirectSymbolsTop = &IndirectSymbols[DySymtab->NumIndirectSymbols];
342 if ((Symbol >= IndirectSymbols) && (Symbol < IndirectSymbolsTop)) {
365 ASSERT (Context->SymbolTable != NULL);
367 if (Index < Context->Symtab->NumSymbols) {
368 Symbol = &(
MACH_X (&Context->SymbolTable->Symbol))[Index];
388 ASSERT (Context->SymbolTable != NULL);
389 ASSERT (Context->Symtab->StringsSize > Symbol->UnifiedName.StringIndex);
391 return (Context->StringTable + Symbol->UnifiedName.StringIndex);
405 ASSERT (Context->SymbolTable != NULL);
413 if (Context->Symtab->StringsSize <= Symbol->Value) {
417 return (Context->StringTable + Symbol->Value);
474 if (Relocation != NULL) {
478 if ((Tmp == NULL) || (MaxSize <
sizeof (
MACH_UINT_X))) {
518 ASSERT (Context->SymbolTable != NULL);
519 SymbolTable =
MACH_X (&Context->SymbolTable->Symbol);
521 DySymtab = Context->DySymtab;
523 if (DySymtab != NULL) {
526 &SymbolTable[DySymtab->LocalSymbolsIndex],
527 DySymtab->NumLocalSymbols,
530 if (Symbol == NULL) {
533 &SymbolTable[DySymtab->ExternalSymbolsIndex],
534 DySymtab->NumExternalSymbols,
539 ASSERT (Context->Symtab != NULL);
543 Context->Symtab->NumSymbols,
572 if (Section == NULL) {
576 Value = ALIGN_VALUE (
577 (Section->Address + LinkAddress),
580 Value -= Section->Address;
588 if (Value < LinkAddress) {
592 Result =
MACH_X (BaseOverflowAddU)(Symbol->Value, Value, &Value);
597 Symbol->Value = Value;
609 OUT UINT32 *FileOffset,
610 OUT UINT32 *MaxSize OPTIONAL
620 ASSERT (FileOffset != NULL);
623 if (Symbol->Section ==
NO_SECT) {
629 (Symbol->Section - 1)
631 if ((Section == NULL) || (Section->Size == 0)) {
638 if ( (Symbol->Value >= Segment->VirtualAddress)
639 && (Symbol->Value < (Segment->VirtualAddress + Segment->Size)))
645 if (Segment == NULL) {
649 Offset = Symbol->Value - Segment->VirtualAddress;
650 Base = Segment->FileOffset;
651 Size = Segment->Size;
653 if (Symbol->Value < Section->Address) {
657 Offset = Symbol->Value - Section->Address;
658 Base = Section->Offset;
659 Size = Section->Size;
660 if (Offset > Section->Size) {
667 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)