VirtualBox

Ignore:
Timestamp:
Aug 31, 2011 12:43:26 PM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
73772
Message:

IPRT: More debug info & ldr stuff.

Location:
trunk/src/VBox/Runtime/common/ldr
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/common/ldr/ldrELFRelocatable.cpp.h

    r38547 r38581  
    705705
    706706
     707/** @copydoc RTLDROPS::pfnLinkAddressToSegOffset. */
     708static DECLCALLBACK(int) RTLDRELF_NAME(LinkAddressToSegOffset)(PRTLDRMODINTERNAL pMod, RTLDRADDR LinkAddress,
     709                                                               uint32_t *piSeg, PRTLDRADDR poffSeg)
     710{
     711    PRTLDRMODELF pModElf = (PRTLDRMODELF)pMod;
     712
     713    return VERR_NOT_IMPLEMENTED;
     714}
     715
     716
     717/** @copydoc RTLDROPS::pfnLinkAddressToRva. */
     718static DECLCALLBACK(int) RTLDRELF_NAME(LinkAddressToRva)(PRTLDRMODINTERNAL pMod, RTLDRADDR LinkAddress, PRTLDRADDR pRva)
     719{
     720    PRTLDRMODELF pModElf = (PRTLDRMODELF)pMod;
     721
     722    return VERR_NOT_IMPLEMENTED;
     723}
     724
     725
     726/** @copydoc RTLDROPS::pfnSegOffsetToRva. */
     727static DECLCALLBACK(int) RTLDRELF_NAME(SegOffsetToRva)(PRTLDRMODINTERNAL pMod, uint32_t iSeg, RTLDRADDR offSeg,
     728                                                       PRTLDRADDR pRva)
     729{
     730    PRTLDRMODELF pModElf = (PRTLDRMODELF)pMod;
     731
     732    return VERR_NOT_IMPLEMENTED;
     733}
     734
     735
     736/** @copydoc RTLDROPS::pfnRvaToSegOffset. */
     737static DECLCALLBACK(int) RTLDRELF_NAME(RvaToSegOffset)(PRTLDRMODINTERNAL pMod, RTLDRADDR Rva,
     738                                                       uint32_t *piSeg, PRTLDRADDR poffSeg)
     739{
     740    PRTLDRMODELF pModElf = (PRTLDRMODELF)pMod;
     741
     742    return VERR_NOT_IMPLEMENTED;
     743}
     744
     745
    707746
    708747/**
     
    727766    RTLDRELF_NAME(EnumDbgInfo),
    728767    RTLDRELF_NAME(EnumSegments),
     768    RTLDRELF_NAME(LinkAddressToSegOffset),
     769    RTLDRELF_NAME(LinkAddressToRva),
     770    RTLDRELF_NAME(SegOffsetToRva),
     771    RTLDRELF_NAME(RvaToSegOffset),
    729772    42
    730773};
  • trunk/src/VBox/Runtime/common/ldr/ldrEx.cpp

    r38547 r38581  
    421421RT_EXPORT_SYMBOL(RTLdrEnumSegments);
    422422
     423
     424RTDECL(int) RTLdrLinkAddressToSegOffset(RTLDRMOD hLdrMod, RTLDRADDR LinkAddress, uint32_t *piSeg, PRTLDRADDR poffSeg)
     425{
     426    LogFlow(("RTLdrLinkAddressToSegOffset: hLdrMod=%RTldrm LinkAddress=%RTptr piSeg=%p poffSeg=%p\n",
     427             hLdrMod, LinkAddress, piSeg, poffSeg));
     428
     429    /*
     430     * Validate input.
     431     */
     432    AssertMsgReturn(rtldrIsValid(hLdrMod), ("hLdrMod=%p\n", hLdrMod), VERR_INVALID_HANDLE);
     433    AssertPtrReturn(piSeg, VERR_INVALID_POINTER);
     434    AssertPtrReturn(poffSeg, VERR_INVALID_POINTER);
     435
     436    PRTLDRMODINTERNAL pMod = (PRTLDRMODINTERNAL)hLdrMod;
     437    //AssertMsgReturn(pMod->eState == LDR_STATE_OPENED, ("eState=%d\n", pMod->eState), VERR_WRONG_ORDER);
     438
     439    *piSeg   = UINT32_MAX;
     440    *poffSeg = ~(RTLDRADDR)0;
     441
     442    /*
     443     * Do it.
     444     */
     445    int rc;
     446    if (pMod->pOps->pfnLinkAddressToSegOffset)
     447        rc = pMod->pOps->pfnLinkAddressToSegOffset(pMod, LinkAddress, piSeg, poffSeg);
     448    else
     449        rc = VERR_NOT_SUPPORTED;
     450
     451    LogFlow(("RTLdrLinkAddressToSegOffset: returns %Rrc %#x:%RTptr\n", rc, *piSeg, *poffSeg));
     452    return rc;
     453}
     454RT_EXPORT_SYMBOL(RTLdrLinkAddressToSegOffset);
     455
     456
     457RTDECL(int) RTLdrLinkAddressToRva(RTLDRMOD hLdrMod, RTLDRADDR LinkAddress, PRTLDRADDR pRva)
     458{
     459    LogFlow(("RTLdrLinkAddressToRva: hLdrMod=%RTldrm LinkAddress=%RTptr pRva=%p\n",
     460             hLdrMod, LinkAddress, pRva));
     461
     462    /*
     463     * Validate input.
     464     */
     465    AssertMsgReturn(rtldrIsValid(hLdrMod), ("hLdrMod=%p\n", hLdrMod), VERR_INVALID_HANDLE);
     466    AssertPtrReturn(pRva, VERR_INVALID_POINTER);
     467
     468    PRTLDRMODINTERNAL pMod = (PRTLDRMODINTERNAL)hLdrMod;
     469    //AssertMsgReturn(pMod->eState == LDR_STATE_OPENED, ("eState=%d\n", pMod->eState), VERR_WRONG_ORDER);
     470
     471    *pRva = ~(RTLDRADDR)0;
     472
     473    /*
     474     * Do it.
     475     */
     476    int rc;
     477    if (pMod->pOps->pfnLinkAddressToRva)
     478        rc = pMod->pOps->pfnLinkAddressToRva(pMod, LinkAddress, pRva);
     479    else
     480        rc = VERR_NOT_SUPPORTED;
     481
     482    LogFlow(("RTLdrLinkAddressToRva: returns %Rrc %RTptr\n", rc, *pRva));
     483    return rc;
     484}
     485RT_EXPORT_SYMBOL(RTLdrLinkAddressToRva);
     486
     487
     488RTDECL(int) RTLdrSegOffsetToRva(RTLDRMOD hLdrMod, uint32_t iSeg, RTLDRADDR offSeg, PRTLDRADDR pRva)
     489{
     490    LogFlow(("RTLdrSegOffsetToRva: hLdrMod=%RTldrm LinkAddress=%RTptr iSeg=%#x offSeg=%RTptr pRva=%p\n",
     491             hLdrMod, iSeg, offSeg, pRva));
     492
     493    /*
     494     * Validate input.
     495     */
     496    AssertMsgReturn(rtldrIsValid(hLdrMod), ("hLdrMod=%p\n", hLdrMod), VERR_INVALID_HANDLE);
     497    AssertPtrReturn(pRva, VERR_INVALID_POINTER);
     498
     499    PRTLDRMODINTERNAL pMod = (PRTLDRMODINTERNAL)hLdrMod;
     500    //AssertMsgReturn(pMod->eState == LDR_STATE_OPENED, ("eState=%d\n", pMod->eState), VERR_WRONG_ORDER);
     501
     502    *pRva = ~(RTLDRADDR)0;
     503
     504    /*
     505     * Do it.
     506     */
     507    int rc;
     508    if (pMod->pOps->pfnSegOffsetToRva)
     509        rc = pMod->pOps->pfnSegOffsetToRva(pMod, iSeg, offSeg, pRva);
     510    else
     511        rc = VERR_NOT_SUPPORTED;
     512
     513    LogFlow(("RTLdrSegOffsetToRva: returns %Rrc %RTptr\n", rc, *pRva));
     514    return rc;
     515}
     516RT_EXPORT_SYMBOL(RTLdrSegOffsetToRva);
     517
     518RTDECL(int) RTLdrRvaToSegOffset(RTLDRMOD hLdrMod, RTLDRADDR Rva, uint32_t *piSeg, PRTLDRADDR poffSeg)
     519{
     520    LogFlow(("RTLdrRvaToSegOffset: hLdrMod=%RTldrm Rva=%RTptr piSeg=%p poffSeg=%p\n",
     521             hLdrMod, Rva, piSeg, poffSeg));
     522
     523    /*
     524     * Validate input.
     525     */
     526    AssertMsgReturn(rtldrIsValid(hLdrMod), ("hLdrMod=%p\n", hLdrMod), VERR_INVALID_HANDLE);
     527    AssertPtrReturn(piSeg, VERR_INVALID_POINTER);
     528    AssertPtrReturn(poffSeg, VERR_INVALID_POINTER);
     529
     530    PRTLDRMODINTERNAL pMod = (PRTLDRMODINTERNAL)hLdrMod;
     531    //AssertMsgReturn(pMod->eState == LDR_STATE_OPENED, ("eState=%d\n", pMod->eState), VERR_WRONG_ORDER);
     532
     533    *piSeg   = UINT32_MAX;
     534    *poffSeg = ~(RTLDRADDR)0;
     535
     536    /*
     537     * Do it.
     538     */
     539    int rc;
     540    if (pMod->pOps->pfnRvaToSegOffset)
     541        rc = pMod->pOps->pfnRvaToSegOffset(pMod, Rva, piSeg, poffSeg);
     542    else
     543        rc = VERR_NOT_SUPPORTED;
     544
     545    LogFlow(("RTLdrRvaToSegOffset: returns %Rrc %#x:%RTptr\n", rc, *piSeg, *poffSeg));
     546    return rc;
     547}
     548RT_EXPORT_SYMBOL(RTLdrRvaToSegOffset);
     549
     550
  • trunk/src/VBox/Runtime/common/ldr/ldrNative.cpp

    r38547 r38581  
    6969    rtldrNativeEnumSymbols,
    7070    /* ext: */
     71    NULL,
     72    NULL,
     73    NULL,
     74    NULL,
    7175    NULL,
    7276    NULL,
  • trunk/src/VBox/Runtime/common/ldr/ldrPE.cpp

    r38547 r38581  
    783783
    784784
     785/** @copydoc RTLDROPS::pfnLinkAddressToSegOffset. */
     786static DECLCALLBACK(int) rtldrPE_LinkAddressToSegOffset(PRTLDRMODINTERNAL pMod, RTLDRADDR LinkAddress,
     787                                                        uint32_t *piSeg, PRTLDRADDR poffSeg)
     788{
     789    return VERR_NOT_IMPLEMENTED;
     790}
     791
     792
     793/** @copydoc RTLDROPS::pfnLinkAddressToRva. */
     794static DECLCALLBACK(int) rtldrPE_LinkAddressToRva(PRTLDRMODINTERNAL pMod, RTLDRADDR LinkAddress, PRTLDRADDR pRva)
     795{
     796    return VERR_NOT_IMPLEMENTED;
     797}
     798
     799
     800/** @copydoc RTLDROPS::pfnSegOffsetToRva. */
     801static DECLCALLBACK(int) rtldrPE_SegOffsetToRva(PRTLDRMODINTERNAL pMod, uint32_t iSeg, RTLDRADDR offSeg,
     802                                                PRTLDRADDR pRva)
     803{
     804    return VERR_NOT_IMPLEMENTED;
     805}
     806
     807
     808/** @copydoc RTLDROPS::pfnRvaToSegOffset. */
     809static DECLCALLBACK(int) rtldrPE_RvaToSegOffset(PRTLDRMODINTERNAL pMod, RTLDRADDR Rva,
     810                                                uint32_t *piSeg, PRTLDRADDR poffSeg)
     811{
     812    return VERR_NOT_IMPLEMENTED;
     813}
     814
     815
    785816/** @copydoc RTLDROPS::pfnDone */
    786817static DECLCALLBACK(int) rtldrPEDone(PRTLDRMODINTERNAL pMod)
     
    843874        rtldrPE_EnumDbgInfo,
    844875        rtldrPE_EnumSegments,
     876        rtldrPE_LinkAddressToSegOffset,
     877        rtldrPE_LinkAddressToRva,
     878        rtldrPE_SegOffsetToRva,
     879        rtldrPE_RvaToSegOffset,
    845880        42
    846881    },
     
    868903        rtldrPE_EnumDbgInfo,
    869904        rtldrPE_EnumSegments,
     905        rtldrPE_LinkAddressToSegOffset,
     906        rtldrPE_LinkAddressToRva,
     907        rtldrPE_SegOffsetToRva,
     908        rtldrPE_RvaToSegOffset,
    870909        42
    871910    },
  • trunk/src/VBox/Runtime/common/ldr/ldrkStuff.cpp

    r38547 r38581  
    683683
    684684
     685/** @copydoc RTLDROPS::pfnLinkAddressToSegOffset. */
     686static DECLCALLBACK(int) rtkldr_LinkAddressToSegOffset(PRTLDRMODINTERNAL pMod, RTLDRADDR LinkAddress,
     687                                                       uint32_t *piSeg, PRTLDRADDR poffSeg)
     688{
     689    PRTLDRMODKLDR   pThis      = (PRTLDRMODKLDR)pMod;
     690    uint32_t const  cSegments  = pThis->pMod->cSegments;
     691    PCKLDRSEG       paSegments = &pThis->pMod->aSegments[0];
     692
     693    for (uint32_t iSeg = 0; iSeg < cSegments; iSeg++)
     694    {
     695        KLDRADDR offSeg = LinkAddress - paSegments[iSeg].LinkAddress;
     696        if (   offSeg < paSegments[iSeg].cbMapped
     697            || offSeg < paSegments[iSeg].cb)
     698        {
     699            *piSeg = iSeg;
     700            *poffSeg = offSeg;
     701            return VINF_SUCCESS;
     702        }
     703    }
     704
     705    return VERR_LDR_INVALID_LINK_ADDRESS;
     706}
     707
     708
     709/** @copydoc RTLDROPS::pfnLinkAddressToRva. */
     710static DECLCALLBACK(int) rtkldr_LinkAddressToRva(PRTLDRMODINTERNAL pMod, RTLDRADDR LinkAddress, PRTLDRADDR pRva)
     711{
     712    PRTLDRMODKLDR   pThis      = (PRTLDRMODKLDR)pMod;
     713    uint32_t const  cSegments  = pThis->pMod->cSegments;
     714    PCKLDRSEG       paSegments = &pThis->pMod->aSegments[0];
     715
     716    for (uint32_t iSeg = 0; iSeg < cSegments; iSeg++)
     717    {
     718        KLDRADDR offSeg = LinkAddress - paSegments[iSeg].LinkAddress;
     719        if (   offSeg < paSegments[iSeg].cbMapped
     720            || offSeg < paSegments[iSeg].cb)
     721        {
     722            *pRva = paSegments[iSeg].RVA + offSeg;
     723            return VINF_SUCCESS;
     724        }
     725    }
     726
     727    return VERR_LDR_INVALID_RVA;
     728}
     729
     730
     731/** @copydoc RTLDROPS::pfnSegOffsetToRva. */
     732static DECLCALLBACK(int) rtkldr_SegOffsetToRva(PRTLDRMODINTERNAL pMod, uint32_t iSeg, RTLDRADDR offSeg,
     733                                               PRTLDRADDR pRva)
     734{
     735    PRTLDRMODKLDR pThis = (PRTLDRMODKLDR)pMod;
     736
     737    if (iSeg >= pThis->pMod->cSegments)
     738        return VERR_LDR_INVALID_SEG_OFFSET;
     739    PCKLDRSEG const pSegment = &pThis->pMod->aSegments[iSeg];
     740
     741    if (   offSeg > pSegment->cbMapped
     742        && offSeg > pSegment->cb
     743        && (    pSegment->cbFile < 0
     744            ||  offSeg > (uint64_t)pSegment->cbFile))
     745        return VERR_LDR_INVALID_SEG_OFFSET;
     746
     747    *pRva = pSegment->RVA + offSeg;
     748    return VINF_SUCCESS;
     749}
     750
     751
     752/** @copydoc RTLDROPS::pfnRvaToSegOffset. */
     753static DECLCALLBACK(int) rtkldr_RvaToSegOffset(PRTLDRMODINTERNAL pMod, RTLDRADDR Rva,
     754                                               uint32_t *piSeg, PRTLDRADDR poffSeg)
     755{
     756    PRTLDRMODKLDR   pThis      = (PRTLDRMODKLDR)pMod;
     757    uint32_t const  cSegments  = pThis->pMod->cSegments;
     758    PCKLDRSEG       paSegments = &pThis->pMod->aSegments[0];
     759
     760    for (uint32_t iSeg = 0; iSeg < cSegments; iSeg++)
     761    {
     762        KLDRADDR offSeg = Rva - paSegments[iSeg].RVA;
     763        if (   offSeg < paSegments[iSeg].cbMapped
     764            || offSeg < paSegments[iSeg].cb)
     765        {
     766            *piSeg = iSeg;
     767            *poffSeg = offSeg;
     768            return VINF_SUCCESS;
     769        }
     770    }
     771
     772    return VERR_LDR_INVALID_RVA;
     773}
     774
     775
    685776/**
    686777 * Operations for a kLdr module.
     
    700791    rtkldr_EnumDbgInfo,
    701792    rtkldr_EnumSegments,
     793    rtkldr_LinkAddressToSegOffset,
     794    rtkldr_LinkAddressToRva,
     795    rtkldr_SegOffsetToRva,
     796    rtkldr_RvaToSegOffset,
    702797    42
    703798};
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