Skip to content

Commit cb6230f

Browse files
committed
fix insym
Signed-off-by: Slice <sergey.slice@gmail.com>
1 parent e21feb5 commit cb6230f

5 files changed

Lines changed: 41 additions & 155 deletions

File tree

Include/Acidanthera/Library/OcMachoLib.h

Lines changed: 0 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ typedef struct {
4141
MACH_NLIST_ANY *SymbolTable;
4242
CHAR8 *StringTable;
4343
MACH_DYSYMTAB_COMMAND *DySymtab;
44-
MACH_NLIST_ANY *IndirectSymbolTable;
4544
MACH_RELOCATION_INFO *LocalRelocations;
4645
MACH_RELOCATION_INFO *ExternRelocations;
4746

@@ -1524,48 +1523,6 @@ MachoGetSymbolTable64 (
15241523
OUT UINT32 *NumUndefinedSymbols OPTIONAL
15251524
);
15261525

1527-
/**
1528-
Obtain indirect symbol table.
1529-
1530-
@param[in] Context Context of the Mach-O.
1531-
@param[in,out] SymbolTable Indirect symbol table.
1532-
1533-
@return number of symbols in indirect symbol table or 0.
1534-
**/
1535-
UINT32
1536-
MachoGetIndirectSymbolTable (
1537-
IN OUT OC_MACHO_CONTEXT *Context,
1538-
OUT CONST MACH_NLIST_ANY **SymbolTable
1539-
);
1540-
1541-
/**
1542-
Obtain indirect 32-bit symbol table.
1543-
1544-
@param[in] Context Context of the Mach-O.
1545-
@param[in,out] SymbolTable Indirect symbol table.
1546-
1547-
@return number of symbols in indirect symbol table or 0.
1548-
**/
1549-
UINT32
1550-
MachoGetIndirectSymbolTable32 (
1551-
IN OUT OC_MACHO_CONTEXT *Context,
1552-
OUT CONST MACH_NLIST **SymbolTable
1553-
);
1554-
1555-
/**
1556-
Obtain indirect 64-bit symbol table.
1557-
1558-
@param[in] Context Context of the Mach-O.
1559-
@param[in,out] SymbolTable Indirect symbol table.
1560-
1561-
@return number of symbols in indirect symbol table or 0.
1562-
**/
1563-
UINT32
1564-
MachoGetIndirectSymbolTable64 (
1565-
IN OUT OC_MACHO_CONTEXT *Context,
1566-
OUT CONST MACH_NLIST_64 **SymbolTable
1567-
);
1568-
15691526
/**
15701527
Returns a pointer to the Mach-O file at the specified virtual address.
15711528

Library/OcAppleKernelLib/Link.c

Lines changed: 21 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1426,7 +1426,7 @@ InternalProcessSymbolPointers (
14261426
MachSize = MachoGetFileSize (MachoContext);
14271427
Result = BaseOverflowMulAddU32 (
14281428
DySymtab->NumIndirectSymbols,
1429-
MachoContext->Is32Bit ? sizeof (UINT32) : sizeof (UINT64),
1429+
sizeof (UINT32),
14301430
DySymtab->IndirectSymbolsOffset,
14311431
&OffsetTop
14321432
);
@@ -1532,8 +1532,6 @@ InternalPrelinkKext (
15321532
CONST MACH_NLIST_ANY *SymbolTable;
15331533
CONST CHAR8 *StringTable;
15341534
UINT32 NumSymbols;
1535-
CONST MACH_NLIST_ANY *IndirectSymtab;
1536-
UINT32 NumIndirectSymbols;
15371535
CONST MACH_NLIST_ANY *LocalSymtab;
15381536
UINT32 NumLocalSymbols;
15391537
CONST MACH_NLIST_ANY *ExternalSymtab;
@@ -1691,29 +1689,27 @@ InternalPrelinkKext (
16911689
// For 32-bit objects, we will solve those at the same time as undefined symbols later.
16921690
//
16931691
if (!IsObject32) {
1694-
WeakTestValue = 0;
1695-
NumIndirectSymbols = MachoGetIndirectSymbolTable (
1696-
MachoContext,
1697-
&IndirectSymtab
1698-
);
1699-
for (Index = 0; Index < NumIndirectSymbols; ++Index) {
1700-
Symbol = (MACH_NLIST_ANY *)&IndirectSymtab[Index];
1701-
SymbolName = MachoGetIndirectSymbolName (MachoContext, Symbol);
1702-
if (SymbolName == NULL) {
1703-
return EFI_LOAD_ERROR;
1704-
}
1692+
WeakTestValue = 0;
1693+
for (Index = 0; Index < NumSymbols; ++Index) {
1694+
Symbol = (MACH_NLIST_ANY *)&(&SymbolTable->Symbol64)[Index];
1695+
if ((Symbol->Symbol64.Type & MACH_N_TYPE_TYPE) == MACH_N_TYPE_INDR) {
1696+
SymbolName = MachoGetIndirectSymbolName (MachoContext, Symbol);
1697+
if (SymbolName == NULL) {
1698+
return EFI_LOAD_ERROR;
1699+
}
17051700

1706-
Result = InternalSolveSymbol (
1707-
Context,
1708-
Kext,
1709-
SymbolName,
1710-
Symbol,
1711-
&WeakTestValue,
1712-
UndefinedSymtab,
1713-
NumUndefinedSymbols
1714-
);
1715-
if (!Result) {
1716-
return EFI_LOAD_ERROR;
1701+
Result = InternalSolveSymbol (
1702+
Context,
1703+
Kext,
1704+
SymbolName,
1705+
Symbol,
1706+
&WeakTestValue,
1707+
UndefinedSymtab,
1708+
NumUndefinedSymbols
1709+
);
1710+
if (!Result) {
1711+
return EFI_LOAD_ERROR;
1712+
}
17171713
}
17181714
}
17191715
}

Library/OcMachoLib/Header.c

Lines changed: 3 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,6 @@ InternalInitialiseSymtabs (
263263
BOOLEAN Result;
264264

265265
MACH_NLIST_ANY *SymbolTable;
266-
MACH_NLIST_ANY *IndirectSymtab;
267266
MACH_RELOCATION_INFO *LocalRelocations;
268267
MACH_RELOCATION_INFO *ExternRelocations;
269268

@@ -310,7 +309,6 @@ InternalInitialiseSymtabs (
310309
}
311310

312311
SymbolTable = (MACH_NLIST_ANY *)Tmp;
313-
IndirectSymtab = NULL;
314312
LocalRelocations = NULL;
315313
ExternRelocations = NULL;
316314

@@ -342,29 +340,6 @@ InternalInitialiseSymtabs (
342340
return FALSE;
343341
}
344342

345-
//
346-
// We additionally check for offset validity here, as KC kexts have some garbage
347-
// in their DySymtab, but it is "valid" for symbols.
348-
//
349-
if ((DySymtab->NumIndirectSymbols > 0) && (DySymtab->IndirectSymbolsOffset != 0)) {
350-
Result = BaseOverflowMulAddU32 (
351-
DySymtab->NumIndirectSymbols,
352-
Context->Is32Bit ? sizeof (MACH_NLIST) : sizeof (MACH_NLIST_64),
353-
DySymtab->IndirectSymbolsOffset,
354-
&OffsetTop
355-
);
356-
if (Result || (OffsetTop > FileSize)) {
357-
return FALSE;
358-
}
359-
360-
Tmp = (VOID *)(FileDataAddress + DySymtab->IndirectSymbolsOffset);
361-
if (!(Context->Is32Bit ? BASE_TYPE_ALIGNED (MACH_NLIST, Tmp) : BASE_TYPE_ALIGNED (MACH_NLIST_64, Tmp))) {
362-
return FALSE;
363-
}
364-
365-
IndirectSymtab = (MACH_NLIST_ANY *)Tmp;
366-
}
367-
368343
if ((DySymtab->NumOfLocalRelocations > 0) && (DySymtab->LocalRelocationsOffset != 0)) {
369344
Result = BaseOverflowMulAddU32 (
370345
DySymtab->NumOfLocalRelocations,
@@ -411,10 +386,9 @@ InternalInitialiseSymtabs (
411386
Context->StringTable = StringTable;
412387
Context->DySymtab = DySymtab;
413388

414-
Context->LocalRelocations = LocalRelocations;
415-
Context->ExternRelocations = ExternRelocations;
416-
Context->SymbolTable = SymbolTable;
417-
Context->IndirectSymbolTable = IndirectSymtab;
389+
Context->LocalRelocations = LocalRelocations;
390+
Context->ExternRelocations = ExternRelocations;
391+
Context->SymbolTable = SymbolTable;
418392

419393
return TRUE;
420394
}
@@ -555,19 +529,6 @@ MachoGetSymbolTable (
555529
);
556530
}
557531

558-
UINT32
559-
MachoGetIndirectSymbolTable (
560-
IN OUT OC_MACHO_CONTEXT *Context,
561-
OUT CONST MACH_NLIST_ANY **SymbolTable
562-
)
563-
{
564-
ASSERT (Context != NULL);
565-
566-
return Context->Is32Bit ?
567-
MachoGetIndirectSymbolTable32 (Context, (CONST MACH_NLIST **)SymbolTable) :
568-
MachoGetIndirectSymbolTable64 (Context, (CONST MACH_NLIST_64 **)SymbolTable);
569-
}
570-
571532
UINT64
572533
MachoRuntimeGetEntryAddress (
573534
IN VOID *Image

Library/OcMachoLib/HeaderX.h

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1456,34 +1456,3 @@ MACH_X (
14561456

14571457
return Context->Symtab->NumSymbols;
14581458
}
1459-
1460-
UINT32
1461-
MACH_X (
1462-
MachoGetIndirectSymbolTable
1463-
)(
1464-
IN OUT OC_MACHO_CONTEXT *Context,
1465-
OUT CONST MACH_NLIST_X **SymbolTable
1466-
) {
1467-
UINT32 Index;
1468-
1469-
ASSERT (Context != NULL);
1470-
ASSERT (SymbolTable != NULL);
1471-
MACH_ASSERT_X (Context);
1472-
1473-
if (!InternalRetrieveSymtabs (Context) || (Context->DySymtab == NULL)) {
1474-
return 0;
1475-
}
1476-
1477-
for (Index = 0; Index < Context->DySymtab->NumIndirectSymbols; ++Index) {
1478-
if (
1479-
!MACH_X (InternalSymbolIsSane)(Context, &(MACH_X (&Context->IndirectSymbolTable->Symbol))[Index])
1480-
)
1481-
{
1482-
return 0;
1483-
}
1484-
}
1485-
1486-
*SymbolTable = MACH_X (&Context->IndirectSymbolTable->Symbol);
1487-
1488-
return Context->DySymtab->NumIndirectSymbols;
1489-
}

Library/OcMachoLib/SymbolsX.h

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -181,9 +181,6 @@ MACH_X (
181181
ASSERT (
182182
( (Symbol >= &(MACH_X (&Context->SymbolTable->Symbol))[0])
183183
&& (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]))
187184
);
188185
//
189186
// Symbol->Section is implicitly verified by MachoGetSectionByIndex() when
@@ -200,11 +197,11 @@ BOOLEAN
200197
MACH_X (
201198
InternalMachoSymbolGetDirectFileOffset
202199
)(
203-
IN OUT OC_MACHO_CONTEXT *Context,
204-
IN MACH_UINT_X Address,
205-
OUT UINT32 *FileOffset,
206-
OUT UINT32 *MaxSize OPTIONAL
207-
) {
200+
IN OUT OC_MACHO_CONTEXT *Context,
201+
IN MACH_UINT_X Address,
202+
OUT UINT32 *FileOffset,
203+
OUT UINT32 *MaxSize OPTIONAL
204+
) {
208205
MACH_UINT_X Offset;
209206
MACH_UINT_X Base;
210207
MACH_UINT_X Size;
@@ -310,8 +307,8 @@ MACH_X (
310307
CONST MACH_DYSYMTAB_COMMAND *DySymtab;
311308
CONST MACH_NLIST_X *UndefinedSymbols;
312309
CONST MACH_NLIST_X *UndefinedSymbolsTop;
313-
CONST MACH_NLIST_X *IndirectSymbols;
314-
CONST MACH_NLIST_X *IndirectSymbolsTop;
310+
CONST MACH_NLIST_X *ExternalSymbols;
311+
CONST MACH_NLIST_X *ExternalSymbolsTop;
315312

316313
ASSERT (Context != NULL);
317314
ASSERT (Symbol != NULL);
@@ -336,11 +333,17 @@ MACH_X (
336333
return FALSE;
337334
}
338335

339-
IndirectSymbols = MACH_X (&Context->IndirectSymbolTable->Symbol);
340-
IndirectSymbolsTop = &IndirectSymbols[DySymtab->NumIndirectSymbols];
336+
//
337+
// If a symbol is marked as external, but is outside the external symbol
338+
// range, it is likely a resolved indirect symbol.
339+
//
340+
if (Symbol->Type == (MACH_N_TYPE_ABS | MACH_N_TYPE_EXT)) {
341+
ExternalSymbols = &(MACH_X (&Context->SymbolTable->Symbol))[DySymtab->ExternalSymbolsIndex];
342+
ExternalSymbolsTop = &ExternalSymbols[DySymtab->NumExternalSymbols];
341343

342-
if ((Symbol >= IndirectSymbols) && (Symbol < IndirectSymbolsTop)) {
343-
return FALSE;
344+
if (!((Symbol >= ExternalSymbols) && (Symbol < ExternalSymbolsTop))) {
345+
return FALSE;
346+
}
344347
}
345348

346349
return MACH_X (MachoSymbolIsDefined)(Symbol);

0 commit comments

Comments
 (0)