VirtualBox

Ignore:
Timestamp:
May 17, 2013 5:21:23 PM (12 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
85849
Message:

IPRT: Dwarf and ELF fixes.

Location:
trunk/src/VBox/Runtime/common/dbg
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/common/dbg/dbgmodcontainer.cpp

    r46134 r46149  
    488488        if (   uRva      <= uCurRvaLast
    489489            && uRvaLast  >= uCurRva
    490             && (cb != 0 || pThis->paSegs[iSeg].cb != 0)) /* HACK ALERT! Allow empty segments to share space (bios/watcom). */
     490            && (   /* HACK ALERT! Allow empty segments to share space (bios/watcom, elf). */
     491                   (cb != 0 && pThis->paSegs[iSeg].cb != 0)
     492                || (   cb == 0
     493                    && uRva != uCurRva
     494                    && uRva != uCurRvaLast)
     495                || (    pThis->paSegs[iSeg].cb == 0
     496                    && uCurRva != uRva
     497                    && uCurRva != uRvaLast)
     498               )
     499           )
    491500            AssertMsgFailedReturn(("uRva=%RTptr uRvaLast=%RTptr (cb=%RTptr) \"%s\";\n"
    492501                                   "uRva=%RTptr uRvaLast=%RTptr (cb=%RTptr) \"%s\" iSeg=%#x\n",
     
    600609            else
    601610            {
    602                 /* between iSeg and iLast. */
     611                /* between iSeg and iLast. paSeg[iSeg].cb == 0 ends up here too. */
    603612                if (iSeg == iLast)
    604613                    break;
  • trunk/src/VBox/Runtime/common/dbg/dbgmoddeferred.cpp

    r46115 r46149  
    451451
    452452/** @interface_method_impl{RTDBGMODVTIMG,pfnMapPart} */
    453 static DECLCALLBACK(int) rtDbgModDeferredImg_MapPart(PRTDBGMODINT pMod, RTFOFF off, size_t cb, void const **ppvMap)
    454 {
    455     int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
    456     if (RT_SUCCESS(rc))
    457         rc = pMod->pImgVt->pfnMapPart(pMod, off, cb, ppvMap);
     453static DECLCALLBACK(int) rtDbgModDeferredImg_MapPart(PRTDBGMODINT pMod, uint32_t iDbgInfo, RTFOFF off, size_t cb, void const **ppvMap)
     454{
     455    int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
     456    if (RT_SUCCESS(rc))
     457        rc = pMod->pImgVt->pfnMapPart(pMod, iDbgInfo, off, cb, ppvMap);
    458458    return rc;
    459459}
     
    465465    PRTDBGMODDEFERRED pThis = (PRTDBGMODDEFERRED)pMod->pvImgPriv;
    466466    return pThis->cbImage;
     467}
     468
     469
     470/** @interface_method_impl{RTDBGMODVTIMG,pfnRvaToSegOffset} */
     471static DECLCALLBACK(int) rtDbgModDeferredImg_RvaToSegOffset(PRTDBGMODINT pMod, RTLDRADDR uRva,
     472                                                            PRTDBGSEGIDX piSeg, PRTLDRADDR poffSeg)
     473{
     474    int rc = rtDbgModDeferredDoIt(pMod, false /*fForceRetry*/);
     475    if (RT_SUCCESS(rc))
     476        rc = pMod->pImgVt->pfnRvaToSegOffset(pMod, uRva, piSeg, poffSeg);
     477    return rc;
    467478}
    468479
     
    538549    /*.pfnGetLoadedSize = */            rtDbgModDeferredImg_ImageSize,
    539550    /*.pfnLinkAddressToSegOffset = */   rtDbgModDeferredImg_LinkAddressToSegOffset,
     551    /*.pfnRvaToSegOffset = */           rtDbgModDeferredImg_RvaToSegOffset,
    540552    /*.pfnMapPart = */                  rtDbgModDeferredImg_MapPart,
    541553    /*.pfnUnmapPart = */                rtDbgModDeferredImg_UnmapPart,
  • trunk/src/VBox/Runtime/common/dbg/dbgmoddwarf.cpp

    r45994 r46149  
    434434        /** Set if present. */
    435435        bool                fPresent;
     436        /** The debug info ordinal number in the image file. */
     437        uint32_t            iDbgInfo;
    436438    } aSections[krtDbgModDwarfSect_End];
    437439
     
    750752    RTDWARFADDRRANGE    PcRange;
    751753    /** The language name. */
    752     uint8_t             uLanguage;
     754    uint16_t            uLanguage;
    753755    /** The identifier case. */
    754756    uint8_t             uIdentifierCase;
     
    11791181        return RTDbgModSegmentAdd(pThis->hCnt, 0, 0, pSeg->pchName, 0 /*fFlags*/, NULL);
    11801182
     1183    /* The link address is 0 for all segments in a relocatable ELF image. */
    11811184    RTLDRADDR cb = RT_MAX(pSeg->cb, pSeg->cbMapped);
    1182 #if 1
    11831185    return RTDbgModSegmentAdd(pThis->hCnt, pSeg->RVA, cb, pSeg->pchName, 0 /*fFlags*/, NULL);
    1184 #else
    1185     return RTDbgModSegmentAdd(pThis->hCnt, pSeg->LinkAddress, cb, pSeg->pchName, 0 /*fFlags*/, NULL);
    1186 #endif
    11871186}
    11881187
     
    13831382     * Do the job.
    13841383     */
    1385     return pThis->pMod->pImgVt->pfnMapPart(pThis->pMod, pThis->aSections[enmSect].offFile, pThis->aSections[enmSect].cb,
     1384    return pThis->pMod->pImgVt->pfnMapPart(pThis->pMod,
     1385                                           pThis->aSections[enmSect].iDbgInfo,
     1386                                           pThis->aSections[enmSect].offFile,
     1387                                           pThis->aSections[enmSect].cb,
    13861388                                           &pThis->aSections[enmSect].pv);
    13871389}
     
    14491451    }
    14501452
    1451     return pThis->pMod->pImgVt->pfnLinkAddressToSegOffset(pThis->pMod, LinkAddress, piSeg, poffSeg);
     1453    return pThis->pMod->pImgVt->pfnRvaToSegOffset(pThis->pMod, LinkAddress, piSeg, poffSeg);
     1454    //return pThis->pMod->pImgVt->pfnLinkAddressToSegOffset(pThis->pMod, LinkAddress, piSeg, poffSeg);
    14521455}
    14531456
     
    20112014    if (offRet != off)
    20122015    {
     2016        AssertFailed();
    20132017        pCursor->rc = VERR_OUT_OF_RANGE;
    20142018        offRet = UINT32_MAX;
     
    23112315        RTUINTPTR   offSeg;
    23122316        rc = rtDbgModDwarfLinkAddressToSegOffset(pLnState->pDwarfMod, pLnState->Regs.uSegment, pLnState->Regs.uAddress,
    2313                                                  &iSeg, &offSeg);
     2317                                                 &iSeg, &offSeg); AssertRC(rc);
    23142318        if (RT_SUCCESS(rc))
    23152319        {
     
    31343138{
    31353139    AssertReturn(ATTR_GET_SIZE(pDesc) == sizeof(RTDWARFADDRRANGE), VERR_INTERNAL_ERROR_3);
    3136     AssertReturn(pDesc->uAttr == DW_AT_low_pc || pDesc->uAttr == DW_AT_high_pc, VERR_INTERNAL_ERROR_3);
     3140    AssertReturn(pDesc->uAttr == DW_AT_ranges, VERR_INTERNAL_ERROR_3);
    31373141    NOREF(pDie);
    31383142
     
    32803284        /* Watcom generates offset past the end of the section, increasing the
    32813285           offset by one for each compile unit. So, just fudge it. */
    3282         Log(("rtDwarfDecode_SectOff: bad off=%#llx, attr %#x (%s), enmSect=%d cb=%#llx; Assuming watcom.\n", off,
     3286        Log(("rtDwarfDecode_SectOff: bad off=%#llx, attr %#x (%s), enmSect=%d cb=%#llx; Assuming watcom/gcc.\n", off,
    32833287             pDesc->uAttr, rtDwarfLog_AttrName(pDesc->uAttr), enmSect, cbSect));
    32843288        off = cbSect;
     
    33463350            *pbMember = (uint8_t)u64Val;
    33473351            if (*pbMember != u64Val)
     3352            {
     3353                AssertFailed();
    33483354                return VERR_OUT_OF_RANGE;
     3355            }
    33493356            break;
    33503357
     
    33523359            *(uint16_t *)pbMember = (uint16_t)u64Val;
    33533360            if (*(uint16_t *)pbMember != u64Val)
     3361            {
     3362                AssertFailed();
    33543363                return VERR_OUT_OF_RANGE;
     3364            }
    33553365            break;
    33563366
     
    33583368            *(uint32_t *)pbMember = (uint32_t)u64Val;
    33593369            if (*(uint32_t *)pbMember != u64Val)
     3370            {
     3371                AssertFailed();
    33603372                return VERR_OUT_OF_RANGE;
     3373            }
    33613374            break;
    33623375
     
    33643377            *(uint64_t *)pbMember = (uint64_t)u64Val;
    33653378            if (*(uint64_t *)pbMember != u64Val)
     3379            {
     3380                AssertFailed();
    33663381                return VERR_OUT_OF_RANGE;
     3382            }
    33673383            break;
    33683384
     
    36703686                                                                     pSubProgram->PcRange.uLowAddress,
    36713687                                                                     &iSeg, &offSeg);
     3688                            AssertRC(rc);
    36723689                            if (RT_SUCCESS(rc))
     3690                            {
    36733691                                rc = RTDbgModSymbolAdd(pThis->hCnt, pSubProgram->pszName, iSeg, offSeg,
    36743692                                                       pSubProgram->PcRange.uHighAddress - pSubProgram->PcRange.uLowAddress,
    36753693                                                       0 /*fFlags*/, NULL /*piOrdinal*/);
     3694                                AssertRC(rc);
     3695                            }
    36763696                            else
    36773697                                Log5(("rtDbgModDwarfLinkAddressToSegOffset failed: %Rrc\n", rc));
     
    36993719                    rc = rtDbgModDwarfLinkAddressToSegOffset(pThis, pLabel->uSegment, pLabel->Address.uAddress,
    37003720                                                             &iSeg, &offSeg);
     3721                    AssertRC(rc);
    37013722                    if (RT_SUCCESS(rc))
     3723                    {
    37023724                        rc = RTDbgModSymbolAdd(pThis->hCnt, pLabel->pszName, iSeg, offSeg, 0 /*cb*/,
    37033725                                               0 /*fFlags*/, NULL /*piOrdinal*/);
     3726                        AssertRC(rc);
     3727                    }
    37043728                    else
    37053729                        Log5(("rtDbgModDwarfLinkAddressToSegOffset failed: %Rrc\n", rc));
     
    43694393    pThis->aSections[enmSect].pv        = NULL;
    43704394    pThis->aSections[enmSect].cb        = (size_t)pDbgInfo->cb;
     4395    pThis->aSections[enmSect].iDbgInfo  = pDbgInfo->iDbgInfo;
    43714396    if (pThis->aSections[enmSect].cb != pDbgInfo->cb)
    43724397        pThis->aSections[enmSect].cb    = ~(size_t)0;
  • trunk/src/VBox/Runtime/common/dbg/dbgmodldr.cpp

    r46113 r46149  
    7171
    7272/** @interface_method_impl{RTDBGMODVTIMG,pfnMapPart} */
    73 static DECLCALLBACK(int) rtDbgModLdr_MapPart(PRTDBGMODINT pMod, RTFOFF off, size_t cb, void const **ppvMap)
     73static DECLCALLBACK(int) rtDbgModLdr_MapPart(PRTDBGMODINT pMod, uint32_t iDbgInfo, RTFOFF off, size_t cb, void const **ppvMap)
    7474{
    7575    PRTDBGMODLDR pThis = (PRTDBGMODLDR)pMod->pvImgPriv;
     
    7979        return VERR_NO_MEMORY;
    8080
    81     int rc = rtLdrReadAt(pThis->hLdrMod, pvMap, off, cb);
     81    int rc = rtLdrReadAt(pThis->hLdrMod, pvMap, iDbgInfo, off, cb);
    8282    if (RT_SUCCESS(rc))
    8383        *ppvMap = pvMap;
     
    9696    PRTDBGMODLDR pThis = (PRTDBGMODLDR)pMod->pvImgPriv;
    9797    return RTLdrSize(pThis->hLdrMod);
     98}
     99
     100
     101/** @interface_method_impl{RTDBGMODVTIMG,pfnRvaToSegOffset} */
     102static DECLCALLBACK(int) rtDbgModLdr_RvaToSegOffset(PRTDBGMODINT pMod, RTLDRADDR uRva,
     103                                                    PRTDBGSEGIDX piSeg, PRTLDRADDR poffSeg)
     104{
     105    PRTDBGMODLDR pThis = (PRTDBGMODLDR)pMod->pvImgPriv;
     106    return RTLdrRvaToSegOffset(pThis->hLdrMod, uRva, piSeg, poffSeg);
    98107}
    99108
     
    176185    /*.pfnGetLoadedSize = */            rtDbgModLdr_GetLoadedSize,
    177186    /*.pfnLinkAddressToSegOffset = */   rtDbgModLdr_LinkAddressToSegOffset,
     187    /*.pfnRvaToSegOffset= */            rtDbgModLdr_RvaToSegOffset,
    178188    /*.pfnMapPart = */                  rtDbgModLdr_MapPart,
    179189    /*.pfnUnmapPart = */                rtDbgModLdr_UnmapPart,
Note: See TracChangeset for help on using the changeset viewer.

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