mirror of
https://github.com/acidanthera/OpenCorePkg.git
synced 2025-12-08 19:25:01 +00:00
OcMachoLib: Use incomplete type completed within the library as Context.
This commit is contained in:
parent
8dc4c32544
commit
92bbf6d606
@ -17,6 +17,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
#include <IndustryStandard/AppleMachoImage.h>
|
||||
|
||||
typedef struct OC_MACHO_CONTEXT_ OC_MACHO_CONTEXT;
|
||||
|
||||
/**
|
||||
Returns the size of a Mach-O Context.
|
||||
|
||||
@ -40,7 +42,7 @@ BOOLEAN
|
||||
MachoInitializeContext (
|
||||
IN CONST MACH_HEADER_64 *MachHeader,
|
||||
IN UINTN FileSize,
|
||||
OUT VOID *Context
|
||||
OUT OC_MACHO_CONTEXT *Context
|
||||
);
|
||||
|
||||
/**
|
||||
@ -51,7 +53,7 @@ MachoInitializeContext (
|
||||
**/
|
||||
UINT64
|
||||
MachoGetLastAddress64 (
|
||||
IN OUT VOID *Context
|
||||
IN OUT OC_MACHO_CONTEXT *Context
|
||||
);
|
||||
|
||||
/**
|
||||
@ -64,7 +66,7 @@ MachoGetLastAddress64 (
|
||||
**/
|
||||
MACH_UUID_COMMAND *
|
||||
MachoGetUuid64 (
|
||||
IN OUT VOID *Context
|
||||
IN OUT OC_MACHO_CONTEXT *Context
|
||||
);
|
||||
|
||||
/**
|
||||
@ -78,8 +80,8 @@ MachoGetUuid64 (
|
||||
**/
|
||||
MACH_SEGMENT_COMMAND_64 *
|
||||
MachoGetSegmentByName64 (
|
||||
IN OUT VOID *Context,
|
||||
IN CONST CHAR8 *SegmentName
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN CONST CHAR8 *SegmentName
|
||||
);
|
||||
|
||||
/**
|
||||
@ -94,7 +96,7 @@ MachoGetSegmentByName64 (
|
||||
**/
|
||||
MACH_SECTION_64 *
|
||||
MachoGetSectionByName64 (
|
||||
IN OUT VOID *Context,
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN CONST MACH_SEGMENT_COMMAND_64 *Segment,
|
||||
IN CONST CHAR8 *SectionName
|
||||
);
|
||||
@ -111,9 +113,9 @@ MachoGetSectionByName64 (
|
||||
**/
|
||||
MACH_SECTION_64 *
|
||||
MachoGetSegmentSectionByName64 (
|
||||
IN OUT VOID *Context,
|
||||
IN CONST CHAR8 *SegmentName,
|
||||
IN CONST CHAR8 *SectionName
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN CONST CHAR8 *SegmentName,
|
||||
IN CONST CHAR8 *SectionName
|
||||
);
|
||||
|
||||
/**
|
||||
@ -128,7 +130,7 @@ MachoGetSegmentSectionByName64 (
|
||||
**/
|
||||
MACH_SEGMENT_COMMAND_64 *
|
||||
MachoGetNextSegment64 (
|
||||
IN OUT VOID *Context,
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN CONST MACH_SEGMENT_COMMAND_64 *Segment OPTIONAL
|
||||
);
|
||||
|
||||
@ -158,7 +160,7 @@ MachoGetFirstSection64 (
|
||||
**/
|
||||
MACH_SECTION_64 *
|
||||
MachoGetNextSection64 (
|
||||
IN OUT VOID *Context,
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN CONST MACH_SEGMENT_COMMAND_64 *Segment,
|
||||
IN CONST MACH_SECTION_64 *Section OPTIONAL
|
||||
);
|
||||
@ -174,8 +176,8 @@ MachoGetNextSection64 (
|
||||
**/
|
||||
MACH_SECTION_64 *
|
||||
MachoGetSectionByIndex64 (
|
||||
IN OUT VOID *Context,
|
||||
IN UINTN Index
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN UINTN Index
|
||||
);
|
||||
|
||||
/**
|
||||
@ -189,8 +191,8 @@ MachoGetSectionByIndex64 (
|
||||
**/
|
||||
MACH_SECTION_64 *
|
||||
MachoGetSectionByAddress64 (
|
||||
IN OUT VOID *Context,
|
||||
IN UINT64 Address
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN UINT64 Address
|
||||
);
|
||||
|
||||
/**
|
||||
@ -224,7 +226,7 @@ MachoSymbolIsDefined (
|
||||
**/
|
||||
BOOLEAN
|
||||
MachoSymbolIsLocalDefined (
|
||||
IN OUT VOID *Context,
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN CONST MACH_NLIST_64 *Symbol
|
||||
);
|
||||
|
||||
@ -237,7 +239,7 @@ MachoSymbolIsLocalDefined (
|
||||
**/
|
||||
MACH_NLIST_64 *
|
||||
MachoGetLocalDefinedSymbolByName (
|
||||
IN OUT VOID *Context,
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN CONST CHAR8 *Name
|
||||
);
|
||||
|
||||
@ -252,8 +254,8 @@ MachoGetLocalDefinedSymbolByName (
|
||||
**/
|
||||
MACH_NLIST_64 *
|
||||
MachoGetSymbolByIndex64 (
|
||||
IN OUT VOID *Context,
|
||||
IN UINT32 Index
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN UINT32 Index
|
||||
);
|
||||
|
||||
/**
|
||||
@ -266,7 +268,7 @@ MachoGetSymbolByIndex64 (
|
||||
**/
|
||||
BOOLEAN
|
||||
MachoIsSymbolValueSane64 (
|
||||
IN OUT VOID *Context,
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN CONST MACH_NLIST_64 *Symbol
|
||||
);
|
||||
|
||||
@ -284,9 +286,9 @@ MachoIsSymbolValueSane64 (
|
||||
**/
|
||||
BOOLEAN
|
||||
MachoGetSymbolByExternRelocationOffset64 (
|
||||
IN OUT VOID *Context,
|
||||
IN UINT64 Address,
|
||||
OUT MACH_NLIST_64 **Symbol
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN UINT64 Address,
|
||||
OUT MACH_NLIST_64 **Symbol
|
||||
);
|
||||
|
||||
/**
|
||||
@ -301,9 +303,9 @@ MachoGetSymbolByExternRelocationOffset64 (
|
||||
**/
|
||||
BOOLEAN
|
||||
MachoRelocateSymbol64 (
|
||||
IN OUT VOID *Context,
|
||||
IN UINT64 LinkAddress,
|
||||
IN OUT MACH_NLIST_64 *Symbol
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN UINT64 LinkAddress,
|
||||
IN OUT MACH_NLIST_64 *Symbol
|
||||
);
|
||||
|
||||
/**
|
||||
@ -337,7 +339,7 @@ MachoIsSymbolNamePadslot (
|
||||
**/
|
||||
BOOLEAN
|
||||
MachoSymbolIsSmcp64 (
|
||||
IN OUT VOID *Context,
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN CONST MACH_NLIST_64 *Symbol
|
||||
);
|
||||
|
||||
@ -350,7 +352,7 @@ MachoSymbolIsSmcp64 (
|
||||
**/
|
||||
BOOLEAN
|
||||
MachoSymbolIsMetaclassPointer64 (
|
||||
IN OUT VOID *Context,
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN CONST MACH_NLIST_64 *Symbol
|
||||
);
|
||||
|
||||
@ -367,7 +369,7 @@ MachoSymbolIsMetaclassPointer64 (
|
||||
**/
|
||||
BOOLEAN
|
||||
MachoGetClassNameFromSuperMetaClassPointer (
|
||||
IN OUT VOID *Context,
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN CONST MACH_NLIST_64 *SmcpSymbol,
|
||||
IN UINTN ClassNameSize,
|
||||
OUT CHAR8 *ClassName
|
||||
@ -414,7 +416,7 @@ MachoGetFunctionPrefixFromClassName (
|
||||
**/
|
||||
BOOLEAN
|
||||
MachoGetClassNameFromMetaClassPointer (
|
||||
IN OUT VOID *Context,
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN CONST MACH_NLIST_64 *MetaClassPtrSymbol,
|
||||
IN UINTN ClassNameSize,
|
||||
OUT CHAR8 *ClassName
|
||||
@ -480,7 +482,7 @@ MachoGetFinalSymbolNameFromClassName (
|
||||
**/
|
||||
BOOLEAN
|
||||
MachoSymbolIsVtable64 (
|
||||
IN OUT VOID *Context,
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN CONST MACH_NLIST_64 *Symbol
|
||||
);
|
||||
|
||||
@ -504,8 +506,8 @@ MachoIsSymbolNameCxx (
|
||||
**/
|
||||
UINTN
|
||||
MachoVtableGetNumberOfEntries64 (
|
||||
IN OUT VOID *Context,
|
||||
IN CONST UINT64 *VtableData
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN CONST UINT64 *VtableData
|
||||
);
|
||||
|
||||
/**
|
||||
@ -519,7 +521,7 @@ MachoVtableGetNumberOfEntries64 (
|
||||
**/
|
||||
MACH_NLIST_64 *
|
||||
MachoGetMetaclassSymbolFromSmcpSymbol64 (
|
||||
IN OUT VOID *Context,
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN CONST MACH_NLIST_64 *Smcp
|
||||
);
|
||||
|
||||
@ -535,7 +537,7 @@ MachoGetMetaclassSymbolFromSmcpSymbol64 (
|
||||
**/
|
||||
BOOLEAN
|
||||
MachoGetVtableSymbolsFromSmcp64 (
|
||||
IN OUT VOID *Context,
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN CONST MACH_NLIST_64 *SmcpSymbol,
|
||||
OUT CONST MACH_NLIST_64 **Vtable,
|
||||
OUT CONST MACH_NLIST_64 **MetaVtable
|
||||
|
||||
@ -79,20 +79,18 @@ MachoIsSymbolNamePadslot (
|
||||
**/
|
||||
BOOLEAN
|
||||
MachoSymbolIsSmcp64 (
|
||||
IN OUT VOID *Context,
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN CONST MACH_NLIST_64 *Symbol
|
||||
)
|
||||
{
|
||||
CONST OC_MACHO_CONTEXT *MachoContext;
|
||||
CONST CHAR8 *Name;
|
||||
CONST CHAR8 *Name;
|
||||
|
||||
ASSERT (Context != NULL);
|
||||
ASSERT (Symbol != NULL);
|
||||
|
||||
MachoContext = (CONST OC_MACHO_CONTEXT *)Context;
|
||||
ASSERT (MachoContext->StringTable != NULL);
|
||||
ASSERT (Context->StringTable != NULL);
|
||||
|
||||
Name = (MachoContext->StringTable + Symbol->UnifiedName.StringIndex);
|
||||
Name = (Context->StringTable + Symbol->UnifiedName.StringIndex);
|
||||
return (AsciiStrStr (Name, SMCP_TOKEN) != NULL);
|
||||
}
|
||||
|
||||
@ -105,20 +103,18 @@ MachoSymbolIsSmcp64 (
|
||||
**/
|
||||
BOOLEAN
|
||||
MachoSymbolIsMetaclassPointer64 (
|
||||
IN OUT VOID *Context,
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN CONST MACH_NLIST_64 *Symbol
|
||||
)
|
||||
{
|
||||
CONST OC_MACHO_CONTEXT *MachoContext;
|
||||
CONST CHAR8 *Name;
|
||||
|
||||
ASSERT (Context != NULL);
|
||||
ASSERT (Symbol != NULL);
|
||||
|
||||
MachoContext = (CONST OC_MACHO_CONTEXT *)Context;
|
||||
ASSERT (MachoContext->StringTable != NULL);
|
||||
ASSERT (Context->StringTable != NULL);
|
||||
|
||||
Name = (MachoContext->StringTable + Symbol->UnifiedName.StringIndex);
|
||||
Name = (Context->StringTable + Symbol->UnifiedName.StringIndex);
|
||||
return (AsciiStrStr (Name, METACLASS_TOKEN) != NULL);
|
||||
}
|
||||
|
||||
@ -135,13 +131,12 @@ MachoSymbolIsMetaclassPointer64 (
|
||||
**/
|
||||
BOOLEAN
|
||||
MachoGetClassNameFromSuperMetaClassPointer (
|
||||
IN OUT VOID *Context,
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN CONST MACH_NLIST_64 *SmcpSymbol,
|
||||
IN UINTN ClassNameSize,
|
||||
OUT CHAR8 *ClassName
|
||||
)
|
||||
{
|
||||
CONST OC_MACHO_CONTEXT *MachoContext;
|
||||
BOOLEAN Result;
|
||||
CONST CHAR8 *SmcpName;
|
||||
UINTN StringSize;
|
||||
@ -154,8 +149,7 @@ MachoGetClassNameFromSuperMetaClassPointer (
|
||||
ASSERT (ClassNameSize > 0);
|
||||
ASSERT (ClassName != NULL);
|
||||
|
||||
MachoContext = (CONST OC_MACHO_CONTEXT *)Context;
|
||||
ASSERT (MachoContext->StringTable != NULL);
|
||||
ASSERT (Context->StringTable != NULL);
|
||||
|
||||
Result = MachoSymbolIsSmcp64 (Context, SmcpSymbol);
|
||||
if (!Result) {
|
||||
@ -163,7 +157,7 @@ MachoGetClassNameFromSuperMetaClassPointer (
|
||||
}
|
||||
|
||||
SmcpName = (
|
||||
MachoContext->StringTable
|
||||
Context->StringTable
|
||||
+ SmcpSymbol->UnifiedName.StringIndex
|
||||
);
|
||||
PrefixSize = (sizeof (OSOBJ_PREFIX) - sizeof (*OSOBJ_PREFIX));
|
||||
@ -264,13 +258,12 @@ MachoGetFunctionPrefixFromClassName (
|
||||
**/
|
||||
BOOLEAN
|
||||
MachoGetClassNameFromMetaClassPointer (
|
||||
IN OUT VOID *Context,
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN CONST MACH_NLIST_64 *MetaClassPtrSymbol,
|
||||
IN UINTN ClassNameSize,
|
||||
OUT CHAR8 *ClassName
|
||||
)
|
||||
{
|
||||
CONST OC_MACHO_CONTEXT *MachoContext;
|
||||
BOOLEAN Result;
|
||||
CONST CHAR8 *MetaClassName;
|
||||
UINTN StringSize;
|
||||
@ -283,8 +276,7 @@ MachoGetClassNameFromMetaClassPointer (
|
||||
ASSERT (ClassNameSize > 0);
|
||||
ASSERT (ClassName != NULL);
|
||||
|
||||
MachoContext = (CONST OC_MACHO_CONTEXT *)Context;
|
||||
ASSERT (MachoContext->StringTable != NULL);
|
||||
ASSERT (Context->StringTable != NULL);
|
||||
|
||||
Result = MachoSymbolIsMetaclassPointer64 (Context, MetaClassPtrSymbol);
|
||||
if (!Result) {
|
||||
@ -292,7 +284,7 @@ MachoGetClassNameFromMetaClassPointer (
|
||||
}
|
||||
|
||||
MetaClassName = (
|
||||
MachoContext->StringTable
|
||||
Context->StringTable
|
||||
+ MetaClassPtrSymbol->UnifiedName.StringIndex
|
||||
);
|
||||
PrefixSize = (sizeof (OSOBJ_PREFIX) - sizeof (*OSOBJ_PREFIX));
|
||||
@ -481,20 +473,18 @@ MachoGetFinalSymbolNameFromClassName (
|
||||
**/
|
||||
BOOLEAN
|
||||
MachoSymbolIsVtable64 (
|
||||
IN OUT VOID *Context,
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN CONST MACH_NLIST_64 *Symbol
|
||||
)
|
||||
{
|
||||
CONST OC_MACHO_CONTEXT *MachoContext;
|
||||
CONST CHAR8 *Name;
|
||||
|
||||
ASSERT (Context != NULL);
|
||||
ASSERT (Symbol != NULL);
|
||||
|
||||
MachoContext = (CONST OC_MACHO_CONTEXT *)Context;
|
||||
ASSERT (MachoContext->StringTable != NULL);
|
||||
ASSERT (Context->StringTable != NULL);
|
||||
|
||||
Name = (MachoContext->StringTable + Symbol->UnifiedName.StringIndex);
|
||||
Name = (Context->StringTable + Symbol->UnifiedName.StringIndex);
|
||||
//
|
||||
// Implicitely checks for METACLASS_VTABLE_PREFIX.
|
||||
//
|
||||
@ -525,8 +515,8 @@ MachoIsSymbolNameCxx (
|
||||
**/
|
||||
UINTN
|
||||
MachoVtableGetNumberOfEntries64 (
|
||||
IN OUT VOID *Context,
|
||||
IN CONST UINT64 *VtableData
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN CONST UINT64 *VtableData
|
||||
)
|
||||
{
|
||||
UINTN Index;
|
||||
@ -557,7 +547,7 @@ MachoVtableGetNumberOfEntries64 (
|
||||
**/
|
||||
MACH_NLIST_64 *
|
||||
MachoGetMetaclassSymbolFromSmcpSymbol64 (
|
||||
IN OUT VOID *Context,
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN CONST MACH_NLIST_64 *Smcp
|
||||
)
|
||||
{
|
||||
@ -591,7 +581,7 @@ MachoGetMetaclassSymbolFromSmcpSymbol64 (
|
||||
**/
|
||||
BOOLEAN
|
||||
MachoGetVtableSymbolsFromSmcp64 (
|
||||
IN OUT VOID *Context,
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN CONST MACH_NLIST_64 *SmcpSymbol,
|
||||
OUT CONST MACH_NLIST_64 **Vtable,
|
||||
OUT CONST MACH_NLIST_64 **MetaVtable
|
||||
|
||||
@ -48,14 +48,13 @@ BOOLEAN
|
||||
MachoInitializeContext (
|
||||
IN CONST MACH_HEADER_64 *MachHeader,
|
||||
IN UINTN FileSize,
|
||||
OUT VOID *Context
|
||||
OUT OC_MACHO_CONTEXT *Context
|
||||
)
|
||||
{
|
||||
UINTN TopOfCommands;
|
||||
UINTN Index;
|
||||
CONST MACH_LOAD_COMMAND *Command;
|
||||
UINTN CommandsSize;
|
||||
OC_MACHO_CONTEXT *MachoContext;
|
||||
|
||||
ASSERT (MachHeader != NULL);
|
||||
ASSERT (FileSize > 0);
|
||||
@ -109,9 +108,8 @@ MachoInitializeContext (
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
MachoContext = (OC_MACHO_CONTEXT *)Context;
|
||||
MachoContext->MachHeader = MachHeader;
|
||||
MachoContext->FileSize = FileSize;
|
||||
Context->MachHeader = MachHeader;
|
||||
Context->FileSize = FileSize;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
@ -124,7 +122,7 @@ MachoInitializeContext (
|
||||
**/
|
||||
UINT64
|
||||
MachoGetLastAddress64 (
|
||||
IN OUT VOID *Context
|
||||
IN OUT OC_MACHO_CONTEXT *Context
|
||||
)
|
||||
{
|
||||
UINT64 LastAddress;
|
||||
@ -165,7 +163,7 @@ MachoGetLastAddress64 (
|
||||
STATIC
|
||||
MACH_LOAD_COMMAND *
|
||||
InternalGetNextCommand64 (
|
||||
IN OUT VOID *Context,
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN MACH_LOAD_COMMAND_TYPE LoadCommandType,
|
||||
IN CONST MACH_LOAD_COMMAND *LoadCommand OPTIONAL
|
||||
)
|
||||
@ -215,7 +213,7 @@ InternalGetNextCommand64 (
|
||||
**/
|
||||
MACH_UUID_COMMAND *
|
||||
MachoGetUuid64 (
|
||||
IN OUT VOID *Context
|
||||
IN OUT OC_MACHO_CONTEXT *Context
|
||||
)
|
||||
{
|
||||
MACH_UUID_COMMAND *UuidCommand;
|
||||
@ -248,8 +246,8 @@ MachoGetUuid64 (
|
||||
**/
|
||||
MACH_SEGMENT_COMMAND_64 *
|
||||
MachoGetSegmentByName64 (
|
||||
IN OUT VOID *Context,
|
||||
IN CONST CHAR8 *SegmentName
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN CONST CHAR8 *SegmentName
|
||||
)
|
||||
{
|
||||
CONST MACH_SEGMENT_COMMAND_64 *Segment;
|
||||
@ -288,7 +286,7 @@ MachoGetSegmentByName64 (
|
||||
**/
|
||||
MACH_SECTION_64 *
|
||||
MachoGetSectionByName64 (
|
||||
IN OUT VOID *Context,
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN CONST MACH_SEGMENT_COMMAND_64 *Segment,
|
||||
IN CONST CHAR8 *SectionName
|
||||
)
|
||||
@ -349,9 +347,9 @@ MachoGetSectionByName64 (
|
||||
**/
|
||||
MACH_SECTION_64 *
|
||||
MachoGetSegmentSectionByName64 (
|
||||
IN OUT VOID *Context,
|
||||
IN CONST CHAR8 *SegmentName,
|
||||
IN CONST CHAR8 *SectionName
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN CONST CHAR8 *SegmentName,
|
||||
IN CONST CHAR8 *SectionName
|
||||
)
|
||||
{
|
||||
CONST MACH_SEGMENT_COMMAND_64 *Segment;
|
||||
@ -381,25 +379,23 @@ MachoGetSegmentSectionByName64 (
|
||||
**/
|
||||
MACH_SEGMENT_COMMAND_64 *
|
||||
MachoGetNextSegment64 (
|
||||
IN OUT VOID *Context,
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN CONST MACH_SEGMENT_COMMAND_64 *Segment OPTIONAL
|
||||
)
|
||||
{
|
||||
MACH_SEGMENT_COMMAND_64 *NextSegment;
|
||||
|
||||
CONST OC_MACHO_CONTEXT *MachoContext;
|
||||
CONST MACH_HEADER_64 *MachHeader;
|
||||
UINTN TopOfCommands;
|
||||
UINTN TopOfSections;
|
||||
|
||||
ASSERT (Context != NULL);
|
||||
|
||||
MachoContext = (CONST OC_MACHO_CONTEXT *)Context;
|
||||
ASSERT (MachoContext->MachHeader != NULL);
|
||||
ASSERT (MachoContext->FileSize > 0);
|
||||
ASSERT (Context->MachHeader != NULL);
|
||||
ASSERT (Context->FileSize > 0);
|
||||
|
||||
if (Segment != NULL) {
|
||||
MachHeader = MachoContext->MachHeader;
|
||||
MachHeader = Context->MachHeader;
|
||||
TopOfCommands = ((UINTN)MachHeader->Commands + MachHeader->CommandsSize);
|
||||
ASSERT (
|
||||
((UINTN)Segment >= (UINTN)&MachHeader->Commands[0])
|
||||
@ -417,7 +413,7 @@ MachoGetNextSegment64 (
|
||||
if ((NextSegment != NULL)
|
||||
&& (NextSegment->CommandSize >= sizeof (*NextSegment))) {
|
||||
TopOfSections = (UINTN)&NextSegment[NextSegment->NumSections];
|
||||
if (((NextSegment->FileOffset + NextSegment->FileSize) > MachoContext->FileSize)
|
||||
if (((NextSegment->FileOffset + NextSegment->FileSize) > Context->FileSize)
|
||||
|| (((UINTN)NextSegment + NextSegment->CommandSize) < TopOfSections)) {
|
||||
return NULL;
|
||||
}
|
||||
@ -439,13 +435,11 @@ MachoGetNextSegment64 (
|
||||
**/
|
||||
MACH_SECTION_64 *
|
||||
MachoGetNextSection64 (
|
||||
IN OUT VOID *Context,
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN CONST MACH_SEGMENT_COMMAND_64 *Segment,
|
||||
IN CONST MACH_SECTION_64 *Section OPTIONAL
|
||||
)
|
||||
{
|
||||
CONST OC_MACHO_CONTEXT *MachoContext;
|
||||
|
||||
ASSERT (Context != NULL);
|
||||
ASSERT (Segment != NULL);
|
||||
|
||||
@ -458,11 +452,10 @@ MachoGetNextSection64 (
|
||||
Section = (MACH_SECTION_64 *)&Segment->Sections[0];
|
||||
}
|
||||
|
||||
MachoContext = (CONST OC_MACHO_CONTEXT *)Context;
|
||||
ASSERT (MachoContext->FileSize > 0);
|
||||
ASSERT (Context->FileSize > 0);
|
||||
|
||||
if (((UINTN)(Section - Segment->Sections) < Segment->NumSections)
|
||||
&& ((Section->Offset + Section->Size) <= MachoContext->FileSize)) {
|
||||
&& ((Section->Offset + Section->Size) <= Context->FileSize)) {
|
||||
return (MACH_SECTION_64 *)Section;
|
||||
}
|
||||
|
||||
@ -480,8 +473,8 @@ MachoGetNextSection64 (
|
||||
**/
|
||||
MACH_SECTION_64 *
|
||||
MachoGetSectionByIndex64 (
|
||||
IN OUT VOID *Context,
|
||||
IN UINTN Index
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN UINTN Index
|
||||
)
|
||||
{
|
||||
CONST MACH_SEGMENT_COMMAND_64 *Segment;
|
||||
@ -517,8 +510,8 @@ MachoGetSectionByIndex64 (
|
||||
**/
|
||||
MACH_SECTION_64 *
|
||||
MachoGetSectionByAddress64 (
|
||||
IN OUT VOID *Context,
|
||||
IN UINT64 Address
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN UINT64 Address
|
||||
)
|
||||
{
|
||||
CONST MACH_SEGMENT_COMMAND_64 *Segment;
|
||||
@ -553,14 +546,14 @@ MachoGetSectionByAddress64 (
|
||||
/**
|
||||
Retrieves the SYMTAB command.
|
||||
|
||||
@param[in,out] MachoContext Context of the Mach-O.
|
||||
@param[in,out] Context Context of the Mach-O.
|
||||
|
||||
@retval NULL NULL is returned on failure.
|
||||
|
||||
**/
|
||||
BOOLEAN
|
||||
InternalRetrieveSymtabs64 (
|
||||
IN OUT OC_MACHO_CONTEXT *MachoContext
|
||||
IN OUT OC_MACHO_CONTEXT *Context
|
||||
)
|
||||
{
|
||||
UINTN MachoAddress;
|
||||
@ -571,16 +564,16 @@ InternalRetrieveSymtabs64 (
|
||||
UINTN OffsetTop;
|
||||
UINTN TopOfSymbols;
|
||||
|
||||
ASSERT (MachoContext != NULL);
|
||||
ASSERT (MachoContext->MachHeader != NULL);
|
||||
ASSERT (MachoContext->FileSize > 0);
|
||||
ASSERT (MachoContext->SymbolTable == NULL);
|
||||
ASSERT (Context != NULL);
|
||||
ASSERT (Context->MachHeader != NULL);
|
||||
ASSERT (Context->FileSize > 0);
|
||||
ASSERT (Context->SymbolTable == NULL);
|
||||
//
|
||||
// Retrieve SYMTAB.
|
||||
//
|
||||
Symtab = (MACH_SYMTAB_COMMAND *)(
|
||||
InternalGetNextCommand64 (
|
||||
(VOID *)MachoContext,
|
||||
(VOID *)Context,
|
||||
MACH_LOAD_COMMAND_SYMTAB,
|
||||
NULL
|
||||
)
|
||||
@ -589,7 +582,7 @@ InternalRetrieveSymtabs64 (
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
FileSize = MachoContext->FileSize;
|
||||
FileSize = Context->FileSize;
|
||||
|
||||
TopOfSymbols = Symtab->SymbolsOffset;
|
||||
TopOfSymbols += (Symtab->NumSymbols * sizeof (MACH_NLIST_64));
|
||||
@ -599,7 +592,7 @@ InternalRetrieveSymtabs64 (
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
MachoAddress = (UINTN)MachoContext->MachHeader;
|
||||
MachoAddress = (UINTN)Context->MachHeader;
|
||||
StringTable = (CONST CHAR8 *)(MachoAddress + Symtab->StringsOffset);
|
||||
|
||||
if (StringTable[(Symtab->StringsSize / sizeof (*StringTable)) - 1] != '\0') {
|
||||
@ -610,7 +603,7 @@ InternalRetrieveSymtabs64 (
|
||||
//
|
||||
DySymtab = (MACH_DYSYMTAB_COMMAND *)(
|
||||
InternalGetNextCommand64 (
|
||||
(VOID *)MachoContext,
|
||||
(VOID *)Context,
|
||||
MACH_LOAD_COMMAND_DYSYMTAB,
|
||||
NULL
|
||||
)
|
||||
@ -639,22 +632,22 @@ InternalRetrieveSymtabs64 (
|
||||
//
|
||||
// Store the symbol information.
|
||||
//
|
||||
MachoContext->NumSymbols = Symtab->NumSymbols;
|
||||
MachoContext->SymbolTable = (CONST MACH_NLIST_64 *)(
|
||||
Context->NumSymbols = Symtab->NumSymbols;
|
||||
Context->SymbolTable = (CONST MACH_NLIST_64 *)(
|
||||
MachoAddress + Symtab->SymbolsOffset
|
||||
);
|
||||
MachoContext->StringsSize = Symtab->StringsSize;
|
||||
MachoContext->StringTable = StringTable;
|
||||
Context->StringsSize = Symtab->StringsSize;
|
||||
Context->StringTable = StringTable;
|
||||
|
||||
MachoContext->IndirectSymbolTable = (CONST MACH_NLIST_64 *)(
|
||||
Context->IndirectSymbolTable = (CONST MACH_NLIST_64 *)(
|
||||
MachoAddress
|
||||
+ DySymtab->IndirectSymbolsOffset
|
||||
);
|
||||
MachoContext->LocalRelocations = (CONST MACH_RELOCATION_INFO *)(
|
||||
Context->LocalRelocations = (CONST MACH_RELOCATION_INFO *)(
|
||||
MachoAddress
|
||||
+ DySymtab->LocalRelocationsOffset
|
||||
);
|
||||
MachoContext->ExternRelocations = (CONST MACH_RELOCATION_INFO *)(
|
||||
Context->ExternRelocations = (CONST MACH_RELOCATION_INFO *)(
|
||||
MachoAddress
|
||||
+ DySymtab->ExternalRelocationsOffset
|
||||
);
|
||||
|
||||
@ -20,7 +20,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
///
|
||||
/// Context used to refer to a Mach-O.
|
||||
///
|
||||
typedef struct {
|
||||
struct OC_MACHO_CONTEXT_ {
|
||||
CONST MACH_HEADER_64 *MachHeader;
|
||||
UINTN FileSize;
|
||||
UINT32 NumSymbols;
|
||||
@ -31,19 +31,19 @@ typedef struct {
|
||||
CONST MACH_NLIST_64 *IndirectSymbolTable;
|
||||
CONST MACH_RELOCATION_INFO *LocalRelocations;
|
||||
CONST MACH_RELOCATION_INFO *ExternRelocations;
|
||||
} OC_MACHO_CONTEXT;
|
||||
};
|
||||
|
||||
/**
|
||||
Retrieves the SYMTAB command.
|
||||
|
||||
@param[in] MachoContext Context of the Mach-O.
|
||||
@param[in] Context Context of the Mach-O.
|
||||
|
||||
@retval NULL NULL is returned on failure.
|
||||
|
||||
**/
|
||||
BOOLEAN
|
||||
InternalRetrieveSymtabs64 (
|
||||
IN OC_MACHO_CONTEXT *MachoContext
|
||||
IN OUT OC_MACHO_CONTEXT *Context
|
||||
);
|
||||
|
||||
/**
|
||||
@ -57,8 +57,8 @@ InternalRetrieveSymtabs64 (
|
||||
**/
|
||||
MACH_RELOCATION_INFO *
|
||||
InternalGetExternalRelocationByOffset (
|
||||
IN OUT VOID *Context,
|
||||
IN UINT64 Address
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN UINT64 Address
|
||||
);
|
||||
|
||||
#endif // OC_MACHO_LIB_INTERNAL_H_
|
||||
|
||||
@ -76,31 +76,28 @@ MachoPreserveRelocationIntel64 (
|
||||
**/
|
||||
MACH_RELOCATION_INFO *
|
||||
InternalGetExternalRelocationByOffset (
|
||||
IN OUT VOID *Context,
|
||||
IN UINT64 Address
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN UINT64 Address
|
||||
)
|
||||
{
|
||||
OC_MACHO_CONTEXT *MachoContext;
|
||||
UINTN Index;
|
||||
CONST MACH_RELOCATION_INFO *Relocation;
|
||||
|
||||
ASSERT (Context != NULL);
|
||||
|
||||
MachoContext = (OC_MACHO_CONTEXT *)Context;
|
||||
//
|
||||
// Assumption: 64-bit.
|
||||
//
|
||||
if ((MachoContext->SymbolTable == NULL)
|
||||
&& !InternalRetrieveSymtabs64 (MachoContext)) {
|
||||
if ((Context->SymbolTable == NULL)
|
||||
&& !InternalRetrieveSymtabs64 (Context)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ASSERT (MachoContext->DySymtab != NULL);
|
||||
ASSERT (MachoContext->ExternRelocations != NULL);
|
||||
ASSERT (Context->DySymtab != NULL);
|
||||
ASSERT (Context->ExternRelocations != NULL);
|
||||
|
||||
for (
|
||||
Index = 0, Relocation = &MachoContext->ExternRelocations[0];
|
||||
Index < MachoContext->DySymtab->NumExternalRelocations;
|
||||
Index = 0, Relocation = &Context->ExternRelocations[0];
|
||||
Index < Context->DySymtab->NumExternalRelocations;
|
||||
++Index, ++Relocation
|
||||
) {
|
||||
//
|
||||
|
||||
@ -25,22 +25,22 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
STATIC
|
||||
BOOLEAN
|
||||
InternalSymbolIsSane (
|
||||
IN OUT OC_MACHO_CONTEXT *MachoContext,
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN CONST MACH_NLIST_64 *Symbol
|
||||
)
|
||||
{
|
||||
ASSERT (MachoContext != NULL);
|
||||
ASSERT (Context != NULL);
|
||||
ASSERT (Symbol != NULL);
|
||||
|
||||
ASSERT (MachoContext->SymbolTable != NULL);
|
||||
ASSERT (MachoContext->NumSymbols > 0);
|
||||
ASSERT ((Symbol > MachoContext->SymbolTable)
|
||||
&& (Symbol <= &MachoContext->SymbolTable[MachoContext->NumSymbols - 1]));
|
||||
ASSERT (Context->SymbolTable != NULL);
|
||||
ASSERT (Context->NumSymbols > 0);
|
||||
ASSERT ((Symbol > Context->SymbolTable)
|
||||
&& (Symbol <= &Context->SymbolTable[Context->NumSymbols - 1]));
|
||||
//
|
||||
// Symbol->Section is implicitly verified by MachoGetSectionByIndex64() when
|
||||
// passed to it.
|
||||
//
|
||||
if (Symbol->UnifiedName.StringIndex >= MachoContext->StringsSize) {
|
||||
if (Symbol->UnifiedName.StringIndex >= Context->StringsSize) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@ -57,7 +57,7 @@ InternalSymbolIsSane (
|
||||
**/
|
||||
BOOLEAN
|
||||
MachoIsSymbolValueSane64 (
|
||||
IN OUT VOID *Context,
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN CONST MACH_NLIST_64 *Symbol
|
||||
)
|
||||
{
|
||||
@ -159,11 +159,10 @@ MachoSymbolIsDefined (
|
||||
**/
|
||||
BOOLEAN
|
||||
MachoSymbolIsLocalDefined (
|
||||
IN OUT VOID *Context,
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN CONST MACH_NLIST_64 *Symbol
|
||||
)
|
||||
{
|
||||
CONST OC_MACHO_CONTEXT *MachoContext;
|
||||
CONST MACH_DYSYMTAB_COMMAND *DySymtab;
|
||||
CONST MACH_NLIST_64 *UndefinedSymbols;
|
||||
CONST MACH_NLIST_64 *UndefinedSymbolsTop;
|
||||
@ -173,9 +172,8 @@ MachoSymbolIsLocalDefined (
|
||||
ASSERT (Context != NULL);
|
||||
ASSERT (Symbol != NULL);
|
||||
|
||||
MachoContext = (CONST OC_MACHO_CONTEXT *)Context;
|
||||
DySymtab = MachoContext->DySymtab;
|
||||
ASSERT (MachoContext->SymbolTable != NULL);
|
||||
DySymtab = Context->DySymtab;
|
||||
ASSERT (Context->SymbolTable != NULL);
|
||||
ASSERT (DySymtab != NULL);
|
||||
|
||||
if (DySymtab->NumUndefinedSymbols == 0) {
|
||||
@ -186,14 +184,14 @@ MachoSymbolIsLocalDefined (
|
||||
// no information on whether the symbol has been solved explicitely, check
|
||||
// its storage location for Undefined or Indirect.
|
||||
//
|
||||
UndefinedSymbols = &MachoContext->SymbolTable[DySymtab->UndefinedSymbolsIndex];
|
||||
UndefinedSymbols = &Context->SymbolTable[DySymtab->UndefinedSymbolsIndex];
|
||||
UndefinedSymbolsTop = &UndefinedSymbols[DySymtab->NumUndefinedSymbols];
|
||||
|
||||
if ((Symbol >= UndefinedSymbols) && (Symbol < UndefinedSymbolsTop)) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
IndirectSymbols = MachoContext->IndirectSymbolTable;
|
||||
IndirectSymbols = Context->IndirectSymbolTable;
|
||||
IndirectSymbolsTop = &IndirectSymbols[DySymtab->NumIndirectSymbols];
|
||||
|
||||
if ((Symbol >= IndirectSymbols) && (Symbol < IndirectSymbolsTop)) {
|
||||
@ -214,28 +212,25 @@ MachoSymbolIsLocalDefined (
|
||||
**/
|
||||
MACH_NLIST_64 *
|
||||
MachoGetSymbolByIndex64 (
|
||||
IN OUT VOID *Context,
|
||||
IN UINT32 Index
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN UINT32 Index
|
||||
)
|
||||
{
|
||||
OC_MACHO_CONTEXT *MachoContext;
|
||||
CONST MACH_NLIST_64 *Symbol;
|
||||
|
||||
ASSERT (Context != NULL);
|
||||
|
||||
MachoContext = (OC_MACHO_CONTEXT *)Context;
|
||||
|
||||
if ((MachoContext->SymbolTable == NULL)
|
||||
&& !InternalRetrieveSymtabs64 (MachoContext)) {
|
||||
if ((Context->SymbolTable == NULL)
|
||||
&& !InternalRetrieveSymtabs64 (Context)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ASSERT (MachoContext->SymbolTable != NULL);
|
||||
ASSERT (MachoContext->NumSymbols > 0);
|
||||
ASSERT (Context->SymbolTable != NULL);
|
||||
ASSERT (Context->NumSymbols > 0);
|
||||
|
||||
if (Index < MachoContext->NumSymbols) {
|
||||
Symbol = &MachoContext->SymbolTable[Index];
|
||||
if (InternalSymbolIsSane (MachoContext, Symbol)) {
|
||||
if (Index < Context->NumSymbols) {
|
||||
Symbol = &Context->SymbolTable[Index];
|
||||
if (InternalSymbolIsSane (Context, Symbol)) {
|
||||
return (MACH_NLIST_64 *)Symbol;
|
||||
}
|
||||
} else {
|
||||
@ -259,25 +254,22 @@ MachoGetSymbolByIndex64 (
|
||||
**/
|
||||
BOOLEAN
|
||||
MachoGetSymbolByExternRelocationOffset64 (
|
||||
IN OUT VOID *Context,
|
||||
IN UINT64 Address,
|
||||
OUT MACH_NLIST_64 **Symbol
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN UINT64 Address,
|
||||
OUT MACH_NLIST_64 **Symbol
|
||||
)
|
||||
{
|
||||
CONST MACH_NLIST_64 *Sym;
|
||||
|
||||
OC_MACHO_CONTEXT *MachoContext;
|
||||
CONST MACH_RELOCATION_INFO *Relocation;
|
||||
|
||||
ASSERT (Context != NULL);
|
||||
ASSERT (Symbol != NULL);
|
||||
|
||||
MachoContext = (OC_MACHO_CONTEXT *)Context;
|
||||
|
||||
Relocation = InternalGetExternalRelocationByOffset (Context, Address);
|
||||
if (Relocation != NULL) {
|
||||
Sym = MachoGetSymbolByIndex64 (Context, Relocation->SymbolNumber);
|
||||
if ((Sym != NULL) && InternalSymbolIsSane (MachoContext, Sym)) {
|
||||
if ((Sym != NULL) && InternalSymbolIsSane (Context, Sym)) {
|
||||
*Symbol = (MACH_NLIST_64 *)Sym;
|
||||
} else {
|
||||
*Symbol = NULL;
|
||||
@ -338,11 +330,10 @@ InternalGetSymbolByName (
|
||||
**/
|
||||
MACH_NLIST_64 *
|
||||
MachoGetLocalDefinedSymbolByName (
|
||||
IN OUT VOID *Context,
|
||||
IN CONST CHAR8 *Name
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN CONST CHAR8 *Name
|
||||
)
|
||||
{
|
||||
OC_MACHO_CONTEXT *MachoContext;
|
||||
CONST MACH_NLIST_64 *SymbolTable;
|
||||
CONST CHAR8 *StringTable;
|
||||
CONST MACH_DYSYMTAB_COMMAND *DySymtab;
|
||||
@ -351,16 +342,14 @@ MachoGetLocalDefinedSymbolByName (
|
||||
ASSERT (Context != NULL);
|
||||
ASSERT (Name != NULL);
|
||||
|
||||
MachoContext = (OC_MACHO_CONTEXT *)Context;
|
||||
|
||||
if ((MachoContext->SymbolTable == NULL)
|
||||
&& !InternalRetrieveSymtabs64 (MachoContext)) {
|
||||
if ((Context->SymbolTable == NULL)
|
||||
&& !InternalRetrieveSymtabs64 (Context)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
SymbolTable = MachoContext->SymbolTable;
|
||||
StringTable = MachoContext->StringTable;
|
||||
DySymtab = MachoContext->DySymtab;
|
||||
SymbolTable = Context->SymbolTable;
|
||||
StringTable = Context->StringTable;
|
||||
DySymtab = Context->DySymtab;
|
||||
ASSERT (SymbolTable != NULL);
|
||||
ASSERT (StringTable != NULL);
|
||||
ASSERT (DySymtab != NULL);
|
||||
@ -380,7 +369,7 @@ MachoGetLocalDefinedSymbolByName (
|
||||
);
|
||||
}
|
||||
|
||||
if ((Symbol != NULL) && !InternalSymbolIsSane (MachoContext, Symbol)) {
|
||||
if ((Symbol != NULL) && !InternalSymbolIsSane (Context, Symbol)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -399,9 +388,9 @@ MachoGetLocalDefinedSymbolByName (
|
||||
**/
|
||||
BOOLEAN
|
||||
MachoRelocateSymbol64 (
|
||||
IN OUT VOID *Context,
|
||||
IN UINT64 LinkAddress,
|
||||
IN OUT MACH_NLIST_64 *Symbol
|
||||
IN OUT OC_MACHO_CONTEXT *Context,
|
||||
IN UINT64 LinkAddress,
|
||||
IN OUT MACH_NLIST_64 *Symbol
|
||||
)
|
||||
{
|
||||
CONST MACH_SECTION_64 *Section;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user