VirtualBox

Changeset 69648 in vbox for trunk


Ignore:
Timestamp:
Nov 10, 2017 5:27:37 PM (7 years ago)
Author:
vboxsync
Message:

dbgkrnlinfo-r0drv-darwin.cpp: Be more verbose in case of symbol table trouble, also ignore weak absolute symbol definitions.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/r0drv/darwin/dbgkrnlinfo-r0drv-darwin.cpp

    r69647 r69648  
    573573 * @returns IPRT status code.
    574574 * @param   pThis               The internal scratch data.
     575 * @param   pszKernelFile       The name of the kernel file.
    575576 */
    576 static int rtR0DbgKrnlDarwinLoadSymTab(RTDBGKRNLINFOINT *pThis)
     577static int rtR0DbgKrnlDarwinLoadSymTab(RTDBGKRNLINFOINT *pThis, const char *pszKernelFile)
    577578{
    578579    /*
     
    612613    {
    613614        if ((uint32_t)pSym->n_un.n_strx >= pThis->cbStrTab)
     615        {
     616            printf("RTR0DbgKrnlInfoOpen: %s: Symbol #%u has a bad string table index: %#x vs cbStrTab=%#x\n",
     617                   pszKernelFile, iSym, pSym->n_un.n_strx, pThis->cbStrTab);
    614618            RETURN_VERR_BAD_EXE_FORMAT;
     619        }
    615620        const char *pszSym = &pThis->pachStrTab[(uint32_t)pSym->n_un.n_strx];
    616621#ifdef IN_RING3
     
    627632                case MACHO_N_SECT:
    628633                    if (pSym->n_sect == MACHO_NO_SECT)
     634                    {
     635                        printf("RTR0DbgKrnlInfoOpen: %s: Symbol #%u '%s' problem: n_sect = MACHO_NO_SECT\n",
     636                               pszKernelFile, iSym, pszSym);
    629637                        RETURN_VERR_BAD_EXE_FORMAT;
     638                    }
    630639                    if (pSym->n_sect > pThis->cSections)
     640                    {
     641                        printf("RTR0DbgKrnlInfoOpen: %s: Symbol #%u '%s' problem: n_sect (%u) is higher than cSections (%u)\n",
     642                               pszKernelFile, iSym, pszSym, pSym->n_sect, pThis->cSections);
    631643                        RETURN_VERR_BAD_EXE_FORMAT;
     644                    }
    632645                    if (pSym->n_desc & ~(REFERENCED_DYNAMICALLY | N_WEAK_DEF))
     646                    {
     647                        printf("RTR0DbgKrnlInfoOpen: %s: Symbol #%u '%s' problem: Unexpected value n_desc=%#x\n",
     648                               pszKernelFile, iSym, pszSym, pSym->n_desc);
    633649                        RETURN_VERR_BAD_EXE_FORMAT;
     650                    }
    634651                    if (   pSym->n_value < pThis->apSections[pSym->n_sect - 1]->addr
    635652                        && strcmp(pszSym, "__mh_execute_header"))    /* in 10.8 it's no longer absolute (PIE?). */
     653                    {
     654                        printf("RTR0DbgKrnlInfoOpen: %s: Symbol #%u '%s' problem: n_value (%#llx) < section addr (%#llx)\n",
     655                               pszKernelFile, iSym, pszSym, pSym->n_value, pThis->apSections[pSym->n_sect - 1]->addr);
    636656                        RETURN_VERR_BAD_EXE_FORMAT;
     657                    }
    637658                    if (      pSym->n_value - pThis->apSections[pSym->n_sect - 1]->addr
    638659                           > pThis->apSections[pSym->n_sect - 1]->size
    639660                        && strcmp(pszSym, "__mh_execute_header"))    /* see above. */
     661                    {
     662                        printf("RTR0DbgKrnlInfoOpen: %s: Symbol #%u '%s' problem: n_value (%#llx) >= end of section (%#llx + %#llx)\n",
     663                               pszKernelFile, iSym, pszSym, pSym->n_value, pThis->apSections[pSym->n_sect - 1]->addr,
     664                               pThis->apSections[pSym->n_sect - 1]->size);
    640665                        RETURN_VERR_BAD_EXE_FORMAT;
     666                    }
    641667                    break;
    642668
     
    645671                        && (   strcmp(pszSym, "__mh_execute_header") /* n_sect=1 in 10.7/amd64 */
    646672                            || pSym->n_sect > pThis->cSections) )
     673                    {
     674                        printf("RTR0DbgKrnlInfoOpen: %s: Abs symbol #%u '%s' problem: n_sect (%u) is not MACHO_NO_SECT\n",
     675                               pszKernelFile, iSym, pszSym);
    647676                        RETURN_VERR_BAD_EXE_FORMAT;
    648                     if (pSym->n_desc & ~(REFERENCED_DYNAMICALLY))
     677                    }
     678                    if (pSym->n_desc & ~(REFERENCED_DYNAMICALLY | N_WEAK_DEF))
     679                    {
     680                        printf("RTR0DbgKrnlInfoOpen: %s: Abs symbol #%u '%s' problem: Unexpected value n_desc=%#x\n",
     681                               pszKernelFile, iSym, pszSym, pSym->n_desc);
    649682                        RETURN_VERR_BAD_EXE_FORMAT;
     683                    }
    650684                    break;
    651685
    652686                case MACHO_N_UNDF:
    653687                    /* No undefined or common symbols in the kernel. */
     688                    printf("RTR0DbgKrnlInfoOpen: %s: Unexpected undefined symbol #%u '%s'\n", pszKernelFile, iSym, pszSym);
    654689                    RETURN_VERR_BAD_EXE_FORMAT;
    655690
    656691                case MACHO_N_INDR:
    657692                    /* No indirect symbols in the kernel. */
     693                    printf("RTR0DbgKrnlInfoOpen: %s: Unexpected indirect symbol #%u '%s'\n", pszKernelFile, iSym, pszSym);
    658694                    RETURN_VERR_BAD_EXE_FORMAT;
    659695
    660696                case MACHO_N_PBUD:
    661697                    /* No prebound symbols in the kernel. */
     698                    printf("RTR0DbgKrnlInfoOpen: %s: Unexpected prebound symbol #%u '%s'\n", pszKernelFile, iSym, pszSym);
    662699                    RETURN_VERR_BAD_EXE_FORMAT;
    663700
    664701                default:
     702                    printf("RTR0DbgKrnlInfoOpen: %s: Unexpected symbol n_type %#x for symbol #%u '%s'\n",
     703                           pszKernelFile, pSym->n_type, iSym, pszSym);
    665704                    RETURN_VERR_BAD_EXE_FORMAT;
    666705            }
     
    10561095        rc = rtR0DbgKrnlDarwinLoadCommands(pThis);
    10571096    if (RT_SUCCESS(rc))
    1058         rc = rtR0DbgKrnlDarwinLoadSymTab(pThis);
     1097        rc = rtR0DbgKrnlDarwinLoadSymTab(pThis, pszKernelFile);
    10591098    if (RT_SUCCESS(rc))
    10601099    {
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette