VirtualBox

Changeset 83084 in vbox


Ignore:
Timestamp:
Feb 15, 2020 3:16:11 PM (5 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
136139
Message:

IPRT,DBGPlugInDarwin: Added flags for indicating that the LINKEDIT segment should be loaded in Mach-O images and debug files.

Location:
trunk
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/iprt/dbg.h

    r82968 r83084  
    12451245/** Overrides the hDbgCfg settings and forces an image and/or symbol file
    12461246 *  search.  RTDbgModCreate will quietly ignore this flag. */
    1247 #define RTDBGMOD_F_NOT_DEFERRED     RT_BIT_32(0)
     1247#define RTDBGMOD_F_NOT_DEFERRED         RT_BIT_32(0)
     1248/** Mach-O: Load the __LINKEDIT segment (@sa RTLDR_O_MACHO_LOAD_LINKEDIT). */
     1249#define RTDBGMOD_F_MACHO_LOAD_LINKEDIT  RT_BIT_32(1)
     1250/** Valid flag mask. */
     1251#define RTDBGMOD_F_VALID_MASK           UINT32_C(0x00000003)
    12481252/** @} */
    12491253
  • trunk/include/iprt/ldr.h

    r82968 r83084  
    443443/** Ignore the architecture specification if there is no code. */
    444444#define RTLDR_O_IGNORE_ARCH_IF_NO_CODE      RT_BIT_32(3)
     445/** Mach-O: Include the __LINKEDIT segment (ignored by the others). */
     446#define RTLDR_O_MACHO_LOAD_LINKEDIT         RT_BIT_32(4)
    445447/** Mask of valid flags. */
    446 #define RTLDR_O_VALID_MASK                  UINT32_C(0x0000000f)
     448#define RTLDR_O_VALID_MASK                  UINT32_C(0x0000001f)
    447449/** @} */
    448450
  • trunk/src/VBox/Debugger/DBGPlugInDarwin.cpp

    r83083 r83084  
    548548     * Process the load commands.
    549549     */
     550    RTUUID          Uuid   = RTUUID_INITIALIZE_NULL;
    550551    RTDBGSEGMENT    aSegs[24];
    551552    uint32_t        cSegs  = 0;
    552     RTUUID          Uuid   = RTUUID_INITIALIZE_NULL;
     553    bool            fHasLinkEdit = false;
    553554    uint32_t        cLeft  = uBuf.Hdr32.ncmds;
    554555    uint32_t        cbLeft = uBuf.Hdr32.sizeofcmds;
     
    559560        segment_command_32_t const *pSeg32;
    560561        segment_command_64_t const *pSeg64;
    561         section_32_t const         *pSect32;
    562         section_64_t const         *pSect64;
    563         symtab_command_t const     *pSymTab;
    564562        uuid_command_t const       *pUuid;
    565563    } uLCmd;
     
    580578                    return VERR_INVALID_NAME;
    581579                if (   !strcmp(uLCmd.pSeg32->segname, "__LINKEDIT")
    582                     && !dbgDiggerDarwinIsSegmentPresent(pUVM, uLCmd.pSeg32->vmaddr, uLCmd.pSeg32->vmsize,
    583                                                         uModAddr, uModAddr + _64M))
     580                    && !(fHasLinkEdit = dbgDiggerDarwinIsSegmentPresent(pUVM, uLCmd.pSeg32->vmaddr, uLCmd.pSeg32->vmsize,
     581                                                                        uModAddr, uModAddr + _64M)))
    584582                    break; /* This usually is discarded or not loaded at all. */
    585583                if (cSegs >= RT_ELEMENTS(aSegs))
     
    601599                    return VERR_INVALID_NAME;
    602600                if (   !strcmp(uLCmd.pSeg64->segname, "__LINKEDIT")
    603                     && !dbgDiggerDarwinIsSegmentPresent(pUVM, uLCmd.pSeg64->vmaddr, uLCmd.pSeg64->vmsize,
    604                                                         uModAddr, uModAddr + _128M))
     601                    && !(fHasLinkEdit = dbgDiggerDarwinIsSegmentPresent(pUVM, uLCmd.pSeg64->vmaddr, uLCmd.pSeg64->vmsize,
     602                                                                        uModAddr, uModAddr + _128M)))
    605603                    break; /* This usually is discarded or not loaded at all. */
    606604                if (cSegs >= RT_ELEMENTS(aSegs))
     
    637635
    638636    if (cbLeft != 0)
     637    {
     638        LogRel(("OSXDig: uModAddr=%#RX64 - %u bytes of command left over!\n", uModAddr, cbLeft));
    639639        return VERR_BAD_EXE_FORMAT;
     640    }
    640641
    641642    /*
     
    657658    RTDBGMOD hMod;
    658659    rc = RTDbgModCreateFromMachOImage(&hMod, pszName, NULL, f64Bit ? RTLDRARCH_AMD64 : RTLDRARCH_X86_32, 0 /*cbImage*/,
    659                                       cSegs, aSegs, &Uuid, DBGFR3AsGetConfig(pUVM), RTDBGMOD_F_NOT_DEFERRED);
     660                                      cSegs, aSegs, &Uuid, DBGFR3AsGetConfig(pUVM),
     661                                      RTDBGMOD_F_NOT_DEFERRED | (fHasLinkEdit ? RTDBGMOD_F_MACHO_LOAD_LINKEDIT : 0));
    660662
    661663    if (RT_FAILURE(rc))
  • trunk/src/VBox/Runtime/common/dbg/dbgmod.cpp

    r82968 r83084  
    329329    AssertPtrReturn(pszName, VERR_INVALID_POINTER);
    330330    AssertReturn(*pszName, VERR_INVALID_PARAMETER);
    331     AssertReturn(fFlags == 0 || fFlags == RTDBGMOD_F_NOT_DEFERRED, VERR_INVALID_PARAMETER);
     331    AssertReturn(fFlags == 0 || fFlags == RTDBGMOD_F_NOT_DEFERRED, VERR_INVALID_FLAGS);
    332332
    333333    int rc = rtDbgModLazyInit();
     
    842842                        pDbgMod->pvImgPriv = NULL;
    843843                        /** @todo need to specify some arch stuff here. */
    844                         rc = pImg->pVt->pfnTryOpen(pDbgMod, enmArch);
     844                        rc = pImg->pVt->pfnTryOpen(pDbgMod, enmArch, 0 /*fLdrFlags*/);
    845845                        if (RT_SUCCESS(rc))
    846846                        {
     
    980980            pDbgMod->pImgVt    = pImg->pVt;
    981981            pDbgMod->pvImgPriv = NULL;
    982             int rc2 = pImg->pVt->pfnTryOpen(pDbgMod, RTLDRARCH_WHATEVER);
     982            int rc2 = pImg->pVt->pfnTryOpen(pDbgMod, RTLDRARCH_WHATEVER, 0 /*fLdrFlags*/);
    983983            if (RT_SUCCESS(rc2))
    984984            {
     
    11591159                    {
    11601160                        PRTDBGMODDEFERRED pDeferred;
    1161                         rc = rtDbgModDeferredCreate(pDbgMod, rtDbgModFromPeImageDeferredCallback, cbImage, hDbgCfg, 0,
    1162                                                     &pDeferred);
     1161                        rc = rtDbgModDeferredCreate(pDbgMod, rtDbgModFromPeImageDeferredCallback, cbImage, hDbgCfg,
     1162                                                    0 /*cbDeferred*/, 0 /*fFlags*/, &pDeferred);
    11631163                        if (RT_SUCCESS(rc))
    11641164                            pDeferred->u.PeImage.uTimestamp = uTimestamp;
     
    12171217    /** For use more internal use in file locator callbacks. */
    12181218    bool                fOpenImage;
     1219    /** RTDBGMOD_F_XXX. */
     1220    uint32_t            fFlags;
    12191221} RTDBGMODMACHOARGS;
    12201222/** Pointer to a const segment package. */
     
    12591261            pDbgMod->pImgVt    = pImg->pVt;
    12601262            pDbgMod->pvImgPriv = NULL;
    1261             int rc2 = pImg->pVt->pfnTryOpen(pDbgMod, pArgs->enmArch);
     1263            int rc2 = pImg->pVt->pfnTryOpen(pDbgMod, pArgs->enmArch,
     1264                                            pArgs->fFlags & RTDBGMOD_F_MACHO_LOAD_LINKEDIT ? RTLDR_O_MACHO_LOAD_LINKEDIT : 0);
    12621265            if (RT_SUCCESS(rc2))
    12631266            {
     
    13501353
    13511354static int rtDbgModFromMachOImageWorker(PRTDBGMODINT pDbgMod, RTLDRARCH enmArch, uint32_t cbImage,
    1352                                         uint32_t cSegs, PCRTDBGSEGMENT paSegs, PCRTUUID pUuid, RTDBGCFG hDbgCfg)
     1355                                        uint32_t cSegs, PCRTDBGSEGMENT paSegs, PCRTUUID pUuid, RTDBGCFG hDbgCfg, uint32_t fFlags)
    13531356{
    13541357    RT_NOREF_PV(cbImage); RT_NOREF_PV(cSegs); RT_NOREF_PV(paSegs);
     
    13581361    Args.pUuid      = pUuid && RTUuidIsNull(pUuid) ? pUuid : NULL;
    13591362    Args.fOpenImage = false;
     1363    Args.fFlags     = fFlags;
    13601364
    13611365    /*
     
    13821386    return rtDbgModFromMachOImageWorker(pDbgMod, pDeferred->u.MachO.enmArch, pDeferred->cbImage,
    13831387                                        pDeferred->u.MachO.cSegs, pDeferred->u.MachO.aSegs,
    1384                                         &pDeferred->u.MachO.Uuid, pDeferred->hDbgCfg);
     1388                                        &pDeferred->u.MachO.Uuid, pDeferred->hDbgCfg, pDeferred->fFlags);
    13851389}
    13861390
     
    14081412    AssertReturn(cbImage || cSegs, VERR_INVALID_PARAMETER);
    14091413    AssertPtrNullReturn(pUuid, VERR_INVALID_POINTER);
    1410     AssertReturn(!(fFlags & ~(RTDBGMOD_F_NOT_DEFERRED)), VERR_INVALID_PARAMETER);
     1414    AssertReturn(!(fFlags & ~RTDBGMOD_F_VALID_MASK), VERR_INVALID_FLAGS);
    14111415
    14121416    int rc = rtDbgModLazyInit();
     
    14481452                    || (!cbImage && !cSegs)
    14491453                    || (fFlags & RTDBGMOD_F_NOT_DEFERRED) )
    1450                     rc = rtDbgModFromMachOImageWorker(pDbgMod, enmArch, cbImage, cSegs, paSegs, pUuid, hDbgCfg);
     1454                    rc = rtDbgModFromMachOImageWorker(pDbgMod, enmArch, cbImage, cSegs, paSegs, pUuid, hDbgCfg, fFlags);
    14511455                else
    14521456                {
     
    14571461                    rc = rtDbgModDeferredCreate(pDbgMod, rtDbgModFromMachOImageDeferredCallback, cbImage, hDbgCfg,
    14581462                                                RT_UOFFSETOF_DYN(RTDBGMODDEFERRED, u.MachO.aSegs[cSegs]),
    1459                                                 &pDeferred);
     1463                                                0 /*fFlags*/, &pDeferred);
    14601464                    if (RT_SUCCESS(rc))
    14611465                    {
  • trunk/src/VBox/Runtime/common/dbg/dbgmoddeferred.cpp

    r82968 r83084  
    636636
    637637/** @interface_method_impl{RTDBGMODVTIMG,pfnTryOpen} */
    638 static DECLCALLBACK(int) rtDbgModDeferredImg_TryOpen(PRTDBGMODINT pMod, RTLDRARCH enmArch)
    639 {
    640     NOREF(enmArch);
     638static DECLCALLBACK(int) rtDbgModDeferredImg_TryOpen(PRTDBGMODINT pMod, RTLDRARCH enmArch, uint32_t fLdrFlags)
     639{
     640    RT_NOREF(enmArch, fLdrFlags);
    641641    return rtDbgModDeferredDoIt(pMod, true /*fForceRetry*/);
    642642}
     
    681681 * @param   cbDeferred          The size of the deferred instance data, 0 if the
    682682 *                              default structure is good enough.
     683 * @param   fFlags              RTDBGMOD_F_XXX.
    683684 * @param   ppDeferred          Where to return the instance data. Can be NULL.
    684685 */
    685686DECLHIDDEN(int) rtDbgModDeferredCreate(PRTDBGMODINT pDbgMod, PFNRTDBGMODDEFERRED pfnDeferred, RTUINTPTR cbImage,
    686                                        RTDBGCFG hDbgCfg, size_t cbDeferred, PRTDBGMODDEFERRED *ppDeferred)
     687                                       RTDBGCFG hDbgCfg, size_t cbDeferred, uint32_t fFlags, PRTDBGMODDEFERRED *ppDeferred)
    687688{
    688689    AssertReturn(!pDbgMod->pDbgVt, VERR_DBG_MOD_IPE);
     
    701702    pDeferred->hDbgCfg     = hDbgCfg;
    702703    pDeferred->pfnDeferred = pfnDeferred;
     704    pDeferred->fFlags      = fFlags;
    703705
    704706    pDbgMod->pDbgVt             = &g_rtDbgModVtDbgDeferred;
  • trunk/src/VBox/Runtime/common/dbg/dbgmoddwarf.cpp

    r82968 r83084  
    60776077            pDbgInfoMod->pszName = pDbgMod->pszName;
    60786078            pDbgInfoMod->pImgVt  = &g_rtDbgModVtImgLdr;
    6079             rc = pDbgInfoMod->pImgVt->pfnTryOpen(pDbgInfoMod, enmArch);
     6079            rc = pDbgInfoMod->pImgVt->pfnTryOpen(pDbgInfoMod, enmArch, 0 /*fLdrFlags*/);
    60806080            if (RT_SUCCESS(rc))
    60816081            {
  • trunk/src/VBox/Runtime/common/dbg/dbgmodldr.cpp

    r82968 r83084  
    216216
    217217/** @interface_method_impl{RTDBGMODVTIMG,pfnTryOpen} */
    218 static DECLCALLBACK(int) rtDbgModLdr_TryOpen(PRTDBGMODINT pMod, RTLDRARCH enmArch)
     218static DECLCALLBACK(int) rtDbgModLdr_TryOpen(PRTDBGMODINT pMod, RTLDRARCH enmArch, uint32_t fLdrFlags)
    219219{
    220220    RTLDRMOD hLdrMod;
    221     int rc = RTLdrOpen(pMod->pszImgFile, RTLDR_O_FOR_DEBUG, enmArch, &hLdrMod);
     221    int rc = RTLdrOpen(pMod->pszImgFile, RTLDR_O_FOR_DEBUG | fLdrFlags, enmArch, &hLdrMod);
    222222    if (RT_SUCCESS(rc))
    223223    {
  • trunk/src/VBox/Runtime/common/ldr/ldrMachO.cpp

    r83079 r83084  
    15251525     */
    15261526    {
    1527         bool                fLoadLinkEdit = false;
     1527        bool                fLoadLinkEdit = RT_BOOL(pThis->fOpenFlags & RTLDR_O_MACHO_LOAD_LINKEDIT);
    15281528        PRTLDRMODMACHOSECT  pSectExtraItr;
    15291529        RTLDRADDR           uNextRVA = 0;
     
    15471547            /* If we're skipping the __LINKEDIT segment, check for it and adjust
    15481548               the number of segments we'll be messing with here.  ASSUMES it's
    1549                last (by now anyway). */
     1549               last (typcially is, but not always for mach_kernel). */
    15501550            if (   !fLoadLinkEdit
    15511551                && cSegmentsToAdjust > 0
  • trunk/src/VBox/Runtime/include/internal/dbgmod.h

    r82968 r83084  
    7979     *                      initialize pImgOps and pvImgPriv.
    8080     * @param   enmArch     The desired architecture.
    81      */
    82     DECLCALLBACKMEMBER(int, pfnTryOpen)(PRTDBGMODINT pMod, RTLDRARCH enmArch);
     81     * @param   fLdrFlags   Extra loader flags (RTLDR_O_XXX).
     82     */
     83    DECLCALLBACKMEMBER(int, pfnTryOpen)(PRTDBGMODINT pMod, RTLDRARCH enmArch, uint32_t fLdrFlags);
    8384
    8485    /**
     
    586587    /** Reference counter. */
    587588    uint32_t volatile   cRefs;
     589    /** RTDBGMOD_F_XXX */
     590    uint32_t            fFlags;
    588591    /** The image size.
    589592     * Deferred loading is almost pointless without knowing the module size, as
     
    708711DECLHIDDEN(int) rtDbgModCreateForExports(PRTDBGMODINT pDbgMod);
    709712DECLHIDDEN(int) rtDbgModDeferredCreate(PRTDBGMODINT pDbgMod, PFNRTDBGMODDEFERRED pfnDeferred, RTUINTPTR cbImage,
    710                                        RTDBGCFG hDbgCfg, size_t cbDeferred, PRTDBGMODDEFERRED *ppDeferred);
     713                                       RTDBGCFG hDbgCfg, size_t cbDeferred, uint32_t fFlags, PRTDBGMODDEFERRED *ppDeferred);
    711714
    712715DECLHIDDEN(int) rtDbgModLdrOpenFromHandle(PRTDBGMODINT pDbgMod, RTLDRMOD hLdrMod);
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