OcMachoLib: Use incomplete type completed within the library as Context.

This commit is contained in:
Download-Fritz 2018-10-21 17:19:40 +02:00
parent 8dc4c32544
commit 92bbf6d606
6 changed files with 149 additions and 178 deletions

View File

@ -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

View File

@ -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

View File

@ -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
);

View File

@ -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_

View File

@ -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
) {
//

View File

@ -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;