20#include <Library/BaseLib.h>
21#include <Library/BaseMemoryLib.h>
22#include <Library/BaseOverflowLib.h>
23#include <Library/DebugLib.h>
33 IN UINT32 HeaderOffset,
49 ASSERT (Context->MachHeader != NULL);
51 return Context->MachHeader;
60 ASSERT (Context->InnerSize != 0);
62 return Context->InnerSize;
71 ASSERT (Context->FileData != NULL);
73 return Context->FileData;
82 ASSERT (Context->FileSize != 0);
84 return Context->FileSize;
94 return Context->Is32Bit ?
105 return Context->Is32Bit ?
118 return Context->Is32Bit ?
135 if (Context->Is32Bit) {
138 "Alignment is not guaranteed."
143 "Alignment is not guaranteed."
152 if ((UuidCommand == NULL) || (UuidCommand->CommandSize != sizeof (*UuidCommand))) {
167 return Context->Is32Bit ?
182 return Context->Is32Bit ?
195 return Context->Is32Bit ?
203 IN CONST CHAR8 *SegmentName
208 return Context->Is32Bit ?
217 IN CONST CHAR8 *SectionName
222 return Context->Is32Bit ?
230 IN CONST CHAR8 *SegmentName,
231 IN CONST CHAR8 *SectionName
236 return Context->Is32Bit ?
259 UINTN FileDataAddress;
273 ASSERT (Context->MachHeader != NULL);
274 ASSERT (Context->FileSize > 0);
275 ASSERT (Context->SymbolTable == NULL);
277 FileSize = Context->FileSize;
279 Result = BaseOverflowMulAddU32 (
282 Symtab->SymbolsOffset,
285 if (Result || (OffsetTop > FileSize)) {
289 Result = BaseOverflowAddU32 (
290 Symtab->StringsOffset,
294 if (Result || (OffsetTop > FileSize)) {
298 FileDataAddress = (UINTN)Context->FileData;
299 StringTable = (CHAR8 *)(FileDataAddress + Symtab->StringsOffset);
301 if ((Symtab->StringsSize == 0) || (StringTable[Symtab->StringsSize - 1] !=
'\0')) {
307 Tmp = (VOID *)(FileDataAddress + Symtab->SymbolsOffset);
313 IndirectSymtab = NULL;
314 LocalRelocations = NULL;
315 ExternRelocations = NULL;
317 if (DySymtab != NULL) {
318 Result = BaseOverflowAddU32 (
319 DySymtab->LocalSymbolsIndex,
320 DySymtab->NumLocalSymbols,
323 if (Result || (OffsetTop > Symtab->NumSymbols)) {
327 Result = BaseOverflowAddU32 (
328 DySymtab->ExternalSymbolsIndex,
329 DySymtab->NumExternalSymbols,
332 if (Result || (OffsetTop > Symtab->NumSymbols)) {
336 Result = BaseOverflowAddU32 (
337 DySymtab->UndefinedSymbolsIndex,
338 DySymtab->NumUndefinedSymbols,
341 if (Result || (OffsetTop > Symtab->NumSymbols)) {
349 if ((DySymtab->NumIndirectSymbols > 0) && (DySymtab->IndirectSymbolsOffset != 0)) {
350 Result = BaseOverflowMulAddU32 (
351 DySymtab->NumIndirectSymbols,
353 DySymtab->IndirectSymbolsOffset,
356 if (Result || (OffsetTop > FileSize)) {
360 Tmp = (VOID *)(FileDataAddress + DySymtab->IndirectSymbolsOffset);
368 if ((DySymtab->NumOfLocalRelocations > 0) && (DySymtab->LocalRelocationsOffset != 0)) {
369 Result = BaseOverflowMulAddU32 (
370 DySymtab->NumOfLocalRelocations,
372 DySymtab->LocalRelocationsOffset,
375 if (Result || (OffsetTop > FileSize)) {
379 Tmp = (VOID *)(FileDataAddress + DySymtab->LocalRelocationsOffset);
387 if ((DySymtab->NumExternalRelocations > 0) && (DySymtab->ExternalRelocationsOffset != 0)) {
388 Result = BaseOverflowMulAddU32 (
389 DySymtab->NumExternalRelocations,
391 DySymtab->ExternalRelocationsOffset,
394 if (Result || (OffsetTop > FileSize)) {
398 Tmp = (VOID *)(FileDataAddress + DySymtab->ExternalRelocationsOffset);
410 Context->Symtab = Symtab;
411 Context->StringTable = StringTable;
412 Context->DySymtab = DySymtab;
414 Context->LocalRelocations = LocalRelocations;
415 Context->ExternRelocations = ExternRelocations;
416 Context->SymbolTable = SymbolTable;
417 Context->IndirectSymbolTable = IndirectSymtab;
435 ASSERT (Context->MachHeader != NULL);
436 ASSERT (SymsContext != NULL);
438 if (Context->SymbolTable != NULL) {
442 MachFlags = Context->Is32Bit ?
443 Context->MachHeader->Header32.Flags :
444 Context->MachHeader->Header64.Flags;
445 SymsMachFlags = SymsContext->Is32Bit ?
446 SymsContext->MachHeader->Header32.Flags :
447 SymsContext->MachHeader->Header64.Flags;
465 "Alignment is not guaranteed."
476 if ((Symtab == NULL) || (Symtab->CommandSize != sizeof (*Symtab))) {
488 "Alignment is not guaranteed."
499 if ((DySymtab == NULL) || (DySymtab->CommandSize != sizeof (*DySymtab))) {
522 OUT CONST CHAR8 **StringTable OPTIONAL,
524 OUT UINT32 *NumLocalSymbols OPTIONAL,
526 OUT UINT32 *NumExternalSymbols OPTIONAL,
528 OUT UINT32 *NumUndefinedSymbols OPTIONAL
533 return Context->Is32Bit ?
566 return Context->Is32Bit ?
593 NumCmds =
Header->Header32.NumCommands;
594 Cmd = &
Header->Header32.Commands[0];
600 NumCmds =
Header->Header64.NumCommands;
601 Cmd = &
Header->Header64.Commands[0];
612 for (Index = 0; Index < NumCmds; ++Index) {
630 OUT UINT32 *MaxSize OPTIONAL
635 if (Context->Is32Bit) {
636 ASSERT (Address < MAX_UINT32);
639 return Context->Is32Bit ?
647 OUT UINT8 *Destination,
648 IN UINT32 DestinationSize,
650 OUT UINT64 *FileOffset OPTIONAL
655 return Context->Is32Bit ?
667 return Context->Is32Bit ?
675 IN CONST CHAR8 *Prefix
680 return Context->Is32Bit ?
VENDOR_DEVICE_PATH Header
#define MACH_HEADER_FLAG_DYNAMIC_LINKER_LINK
#define MACH_LOAD_COMMAND_UUID
#define NEXT_MACH_LOAD_COMMAND(Command)
#define MACH_LOAD_COMMAND_DYSYMTAB
#define MACH_LOAD_COMMAND_UNIX_THREAD
#define MACH_LOAD_COMMAND_SYMTAB
UINT32 MACH_LOAD_COMMAND_TYPE
#define MACH_HEADER_SIGNATURE
the mach magic number
#define MACH_HEADER_64_SIGNATURE
the 64-bit mach magic number
STATIC_ASSERT(BYTES_PER_PIXEL==sizeof(UINT32), "Non 4-byte pixels are unsupported!")
MACH_SEGMENT_COMMAND_64 * MachoGetNextSegment64(IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_SEGMENT_COMMAND_64 *Segment OPTIONAL)
BOOLEAN MachoInitializeContext64(OUT OC_MACHO_CONTEXT *Context, IN VOID *FileData, IN UINT32 FileSize, IN UINT32 HeaderOffset, IN UINT32 InnerSize)
UINT32 MachoGetSymbolTable32(IN OUT OC_MACHO_CONTEXT *Context, OUT CONST MACH_NLIST **SymbolTable, OUT CONST CHAR8 **StringTable OPTIONAL, OUT CONST MACH_NLIST **LocalSymbols OPTIONAL, OUT UINT32 *NumLocalSymbols OPTIONAL, OUT CONST MACH_NLIST **ExternalSymbols OPTIONAL, OUT UINT32 *NumExternalSymbols OPTIONAL, OUT CONST MACH_NLIST **UndefinedSymbols OPTIONAL, OUT UINT32 *NumUndefinedSymbols OPTIONAL)
MACH_SECTION * MachoGetSectionByName32(IN OUT OC_MACHO_CONTEXT *Context, IN MACH_SEGMENT_COMMAND *Segment, IN CONST CHAR8 *SectionName)
MACH_SECTION_64 * MachoGetSegmentSectionByName64(IN OUT OC_MACHO_CONTEXT *Context, IN CONST CHAR8 *SegmentName, IN CONST CHAR8 *SectionName)
MACH_SECTION * MachoGetNextSection32(IN OUT OC_MACHO_CONTEXT *Context, IN MACH_SEGMENT_COMMAND *Segment, IN MACH_SECTION *Section OPTIONAL)
MACH_SEGMENT_COMMAND * MachoGetSegmentByName32(IN OUT OC_MACHO_CONTEXT *Context, IN CONST CHAR8 *SegmentName)
UINT32 MachoGetSymbolTable64(IN OUT OC_MACHO_CONTEXT *Context, OUT CONST MACH_NLIST_64 **SymbolTable, OUT CONST CHAR8 **StringTable OPTIONAL, OUT CONST MACH_NLIST_64 **LocalSymbols OPTIONAL, OUT UINT32 *NumLocalSymbols OPTIONAL, OUT CONST MACH_NLIST_64 **ExternalSymbols OPTIONAL, OUT UINT32 *NumExternalSymbols OPTIONAL, OUT CONST MACH_NLIST_64 **UndefinedSymbols OPTIONAL, OUT UINT32 *NumUndefinedSymbols OPTIONAL)
UINT32 MachoGetIndirectSymbolTable32(IN OUT OC_MACHO_CONTEXT *Context, OUT CONST MACH_NLIST **SymbolTable)
MACH_SECTION * MachoGetSegmentSectionByName32(IN OUT OC_MACHO_CONTEXT *Context, IN CONST CHAR8 *SegmentName, IN CONST CHAR8 *SectionName)
BOOLEAN MachoInitializeContext32(OUT OC_MACHO_CONTEXT *Context, IN VOID *FileData, IN UINT32 FileSize, IN UINT32 HeaderOffset, IN UINT32 InnerSize)
MACH_SECTION_64 * MachoGetNextSection64(IN OUT OC_MACHO_CONTEXT *Context, IN MACH_SEGMENT_COMMAND_64 *Segment, IN MACH_SECTION_64 *Section OPTIONAL)
MACH_SECTION_64 * MachoGetSectionByName64(IN OUT OC_MACHO_CONTEXT *Context, IN MACH_SEGMENT_COMMAND_64 *Segment, IN CONST CHAR8 *SectionName)
MACH_SEGMENT_COMMAND * MachoGetNextSegment32(IN OUT OC_MACHO_CONTEXT *Context, IN CONST MACH_SEGMENT_COMMAND *Segment OPTIONAL)
MACH_SECTION_64 * MachoGetSectionByIndex64(IN OUT OC_MACHO_CONTEXT *Context, IN UINT32 Index)
MACH_SEGMENT_COMMAND_64 * MachoGetSegmentByName64(IN OUT OC_MACHO_CONTEXT *Context, IN CONST CHAR8 *SegmentName)
MACH_SECTION * MachoGetSectionByIndex32(IN OUT OC_MACHO_CONTEXT *Context, IN UINT32 Index)
UINT32 MachoGetIndirectSymbolTable64(IN OUT OC_MACHO_CONTEXT *Context, OUT CONST MACH_NLIST_64 **SymbolTable)
UINT32 InternalMachoExpandImage32(IN OC_MACHO_CONTEXT *Context, IN BOOLEAN CalculateSizeOnly, OUT UINT8 *Destination, IN UINT32 DestinationSize, IN BOOLEAN Strip, OUT UINT64 *FileOffset OPTIONAL)
UINT32 InternalMachoGetLastAddress32(IN OUT OC_MACHO_CONTEXT *Context)
VOID * InternalMachoGetFilePointerByAddress64(IN OUT OC_MACHO_CONTEXT *Context, IN UINT64 Address, OUT UINT32 *MaxSize OPTIONAL)
BOOLEAN InternalMachoMergeSegments32(IN OUT OC_MACHO_CONTEXT *Context, IN CONST CHAR8 *Prefix)
UINT64 InternalMachoGetLastAddress64(IN OUT OC_MACHO_CONTEXT *Context)
UINT32 InternalMachoGetVmSize32(IN OUT OC_MACHO_CONTEXT *Context)
UINT32 InternalMachoExpandImage64(IN OC_MACHO_CONTEXT *Context, IN BOOLEAN CalculateSizeOnly, OUT UINT8 *Destination, IN UINT32 DestinationSize, IN BOOLEAN Strip, OUT UINT64 *FileOffset OPTIONAL)
BOOLEAN InternalMachoMergeSegments64(IN OUT OC_MACHO_CONTEXT *Context, IN CONST CHAR8 *Prefix)
MACH_LOAD_COMMAND * InternalMachoGetNextCommand64(IN OUT OC_MACHO_CONTEXT *Context, IN MACH_LOAD_COMMAND_TYPE LoadCommandType, IN CONST MACH_LOAD_COMMAND *LoadCommand OPTIONAL)
MACH_LOAD_COMMAND * InternalMachoGetNextCommand32(IN OUT OC_MACHO_CONTEXT *Context, IN MACH_LOAD_COMMAND_TYPE LoadCommandType, IN CONST MACH_LOAD_COMMAND *LoadCommand OPTIONAL)
UINT32 InternalMachoGetVmSize64(IN OUT OC_MACHO_CONTEXT *Context)
VOID * InternalMachoGetFilePointerByAddress32(IN OUT OC_MACHO_CONTEXT *Context, IN UINT32 Address, OUT UINT32 *MaxSize OPTIONAL)
MACH_X86_THREAD_STATE32 State32
MACH_X86_THREAD_STATE64 State64