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;
272 ASSERT (Context->MachHeader != NULL);
273 ASSERT (Context->FileSize > 0);
274 ASSERT (Context->SymbolTable == NULL);
276 FileSize = Context->FileSize;
278 Result = BaseOverflowMulAddU32 (
281 Symtab->SymbolsOffset,
284 if (Result || (OffsetTop > FileSize)) {
288 Result = BaseOverflowAddU32 (
289 Symtab->StringsOffset,
293 if (Result || (OffsetTop > FileSize)) {
297 FileDataAddress = (UINTN)Context->FileData;
298 StringTable = (CHAR8 *)(FileDataAddress + Symtab->StringsOffset);
300 if ((Symtab->StringsSize == 0) || (StringTable[Symtab->StringsSize - 1] !=
'\0')) {
306 Tmp = (VOID *)(FileDataAddress + Symtab->SymbolsOffset);
312 LocalRelocations = NULL;
313 ExternRelocations = NULL;
315 if (DySymtab != NULL) {
316 Result = BaseOverflowAddU32 (
317 DySymtab->LocalSymbolsIndex,
318 DySymtab->NumLocalSymbols,
321 if (Result || (OffsetTop > Symtab->NumSymbols)) {
325 Result = BaseOverflowAddU32 (
326 DySymtab->ExternalSymbolsIndex,
327 DySymtab->NumExternalSymbols,
330 if (Result || (OffsetTop > Symtab->NumSymbols)) {
334 Result = BaseOverflowAddU32 (
335 DySymtab->UndefinedSymbolsIndex,
336 DySymtab->NumUndefinedSymbols,
339 if (Result || (OffsetTop > Symtab->NumSymbols)) {
343 if ((DySymtab->NumOfLocalRelocations > 0) && (DySymtab->LocalRelocationsOffset != 0)) {
344 Result = BaseOverflowMulAddU32 (
345 DySymtab->NumOfLocalRelocations,
347 DySymtab->LocalRelocationsOffset,
350 if (Result || (OffsetTop > FileSize)) {
354 Tmp = (VOID *)(FileDataAddress + DySymtab->LocalRelocationsOffset);
362 if ((DySymtab->NumExternalRelocations > 0) && (DySymtab->ExternalRelocationsOffset != 0)) {
363 Result = BaseOverflowMulAddU32 (
364 DySymtab->NumExternalRelocations,
366 DySymtab->ExternalRelocationsOffset,
369 if (Result || (OffsetTop > FileSize)) {
373 Tmp = (VOID *)(FileDataAddress + DySymtab->ExternalRelocationsOffset);
385 Context->Symtab = Symtab;
386 Context->StringTable = StringTable;
387 Context->DySymtab = DySymtab;
389 Context->LocalRelocations = LocalRelocations;
390 Context->ExternRelocations = ExternRelocations;
391 Context->SymbolTable = SymbolTable;
409 ASSERT (Context->MachHeader != NULL);
410 ASSERT (SymsContext != NULL);
412 if (Context->SymbolTable != NULL) {
416 MachFlags = Context->Is32Bit ?
417 Context->MachHeader->Header32.Flags :
418 Context->MachHeader->Header64.Flags;
419 SymsMachFlags = SymsContext->Is32Bit ?
420 SymsContext->MachHeader->Header32.Flags :
421 SymsContext->MachHeader->Header64.Flags;
439 "Alignment is not guaranteed."
450 if ((Symtab == NULL) || (Symtab->CommandSize != sizeof (*Symtab))) {
462 "Alignment is not guaranteed."
473 if ((DySymtab == NULL) || (DySymtab->CommandSize != sizeof (*DySymtab))) {
496 OUT CONST CHAR8 **StringTable OPTIONAL,
498 OUT UINT32 *NumLocalSymbols OPTIONAL,
500 OUT UINT32 *NumExternalSymbols OPTIONAL,
502 OUT UINT32 *NumUndefinedSymbols OPTIONAL
507 return Context->Is32Bit ?
554 NumCmds =
Header->Header32.NumCommands;
555 Cmd = &
Header->Header32.Commands[0];
561 NumCmds =
Header->Header64.NumCommands;
562 Cmd = &
Header->Header64.Commands[0];
573 for (Index = 0; Index < NumCmds; ++Index) {
591 OUT UINT32 *MaxSize OPTIONAL
596 if (Context->Is32Bit) {
597 ASSERT (Address < MAX_UINT32);
600 return Context->Is32Bit ?
608 OUT UINT8 *Destination,
609 IN UINT32 DestinationSize,
611 OUT UINT64 *FileOffset OPTIONAL
616 return Context->Is32Bit ?
628 return Context->Is32Bit ?
636 IN CONST CHAR8 *Prefix
641 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)
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 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