Changeset 2859


Ignore:
Timestamp:
Nov 6, 2006, 5:48:53 AM (18 years ago)
Author:
bird
Message:

More debugging.

Location:
trunk/kLdr
Files:
1 added
5 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified trunk/kLdr/Makefile.kmk

    r2858 r2859  
    2525#
    2626
     27
     28DEPTH = ..
     29include $(PATH_KBUILD)/header.kmk
     30
     31DEFAULT_PASSES := $(filter-out PACKING, $(DEFAULT_PASSES)) # annoying on windows.
    2732
    2833#
     
    156161
    157162# generate rules.
    158 DEPTH = ..
    159 include $(PATH_KBUILD)/rules.kmk
     163include $(PATH_KBUILD)/footer.kmk
    160164
  • TabularUnified trunk/kLdr/kLdr.h

    r2858 r2859  
    6464#define NIL_KLDRADDR    (~(uint64_t)0)
    6565
     66/** @def PRI_KLDRADDR
     67 * printf format type. */
     68#ifdef _MSC_VER
     69# define PRI_KLDRADDR    "I64x"
     70#else
     71# define PRI_KLDRADDR    "llx"
     72#endif
     73
     74
    6675/** The kLdr size type. */
    6776typedef uint64_t KLDRSIZE;
     
    7079/** Pointer to a const kLdr size. */
    7180typedef const KLDRSIZE *PCKLDRSIZE;
     81
     82/** @def PRI_KLDRSIZE
     83 * printf format type. */
     84#ifdef _MSC_VER
     85# define PRI_KLDRSIZE    "I64x"
     86#else
     87# define PRI_KLDRSIZE    "llx"
     88#endif
    7289
    7390
     
    404421     * Set to -1 if no file backing (like BSS). */
    405422    off_t           cbFile;
     423    /** The relative virtual address when mapped.
     424     * Set to NIL_KLDRADDR if the segment isn't supposed to be mapped. */
     425    KLDRADDR        RVA;
     426    /** The size of the segment including the alignment gap up to the next segment when mapped. */
     427    size_t          cbMapped;
    406428    /** The address the segment was mapped at by kLdrModMap().
    407429     * Set to 0 if not mapped. */
    408430    uintptr_t       MapAddress;
    409     /** The size of the segment including the alignment gap up to the next segment when mapped. */
    410     size_t          cbMapped;
    411431} KLDRSEG;
    412432/** Pointer to a loader segment. */
     
    551571/** Special import module ordinal value used to indicate that there is no
    552572 * specific module associated with the requested symbol. */
    553 #define NIL_KLDRMOD_IMPORT                 (~(uint32_t)0)
     573#define NIL_KLDRMOD_IMPORT                  (~(uint32_t)0)
    554574
    555575/** Special symbol ordinal value used to indicate that the symbol
    556576 * only has a string name. */
    557 #define NIL_KLDRMOD_SYM_ORDINAL            (~(uint32_t)0)
     577#define NIL_KLDRMOD_SYM_ORDINAL             (~(uint32_t)0)
    558578
    559579
     
    601621 * @param   pMod        The module which fixups are begin applied.
    602622 * @param   iImport     The import module ordinal number or NIL_KLDRMOD_IMPORT.
    603  * @param   uSymbol     The symbol ordinal number or NIL_KLDRMOD_SYM_ORDINAL.
    604  * @param   pszSymbol   The symbol name. Can be NULL if uSymbol isn't nil.
     623 * @param   iSymbol     The symbol ordinal number or NIL_KLDRMOD_SYM_ORDINAL.
     624 * @param   pszSymbol   The symbol name. Can be NULL if iSymbol isn't nil.
    605625 * @param   puValue     Where to store the symbol value.
    606626 * @param   pfKind      Where to store the symbol kind flags.
    607627 * @param   pvUser      The user parameter specified to the relocation function.
    608628 */
    609 typedef int FNKLDRMODGETIMPORT(PKLDRMOD pMod, uint32_t iImport, uint32_t uSymbol, const char *pszSymbol,
     629typedef int FNKLDRMODGETIMPORT(PKLDRMOD pMod, uint32_t iImport, uint32_t iSymbol, const char *pszSymbol,
    610630                               PKLDRADDR puValue, uint32_t *pfKind, void *pvUser);
    611631/** Pointer to a import callback. */
     
    619639 *
    620640 * @param   pMod        The module which symbols are being enumerated.s
    621  * @param   uSymbol     The symbol ordinal number or NIL_KLDRMOD_SYM_ORDINAL.
     641 * @param   iSymbol     The symbol ordinal number or NIL_KLDRMOD_SYM_ORDINAL.
    622642 * @param   pszSymbol   The symbol name. This can be NULL if there is a symbol ordinal.
    623643 *                      This can also be an empty string if the symbol doesn't have a name
     
    627647 * @param   pvUser      The user parameter specified to kLdrModEnumSymbols().
    628648 */
    629 typedef int FNKLDRMODENUMSYMS(PKLDRMOD pMod, uint32_t uSymbol, const char *pszSymbol,
     649typedef int FNKLDRMODENUMSYMS(PKLDRMOD pMod, uint32_t iSymbol, const char *pszSymbol,
    630650                              KLDRADDR uValue, uint32_t fKind, void *pvUser);
    631651/** Pointer to a symbol enumerator callback. */
     
    652672 */
    653673typedef int FNKLDRENUMDBG(PKLDRMOD pMod, uint32_t iDbgInfo, KLDRDBGINFOTYPE enmType, int16_t iMajorVer, int16_t iMinorVer,
    654                           off_t offFile, KLDRADDR LinkAddress, off_t cb, const char *pszExtFile, void *pvUser);
     674                          off_t offFile, KLDRADDR LinkAddress, KLDRSIZE cb, const char *pszExtFile, void *pvUser);
    655675/** Pointer to a debug info enumberator callback. */
    656676typedef FNKLDRENUMDBG *PFNKLDRENUMDBG;
     
    661681int     kLdrModClose(PKLDRMOD pMod);
    662682
    663 int     kLdrModQuerySymbol(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, uint32_t uSymbol,
     683int     kLdrModQuerySymbol(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, uint32_t iSymbol,
    664684                           const char *pszSymbol, PFNKLDRMODGETIMPORT pfnGetForwarder, void *pvUser,
    665685                           PKLDRADDR puValue, uint32_t *pfKind);
     
    730750
    731751    /** @copydoc kLdrModQuerySymbol */
    732     int (* pfnQuerySymbol)(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, uint32_t uSymbol,
     752    int (* pfnQuerySymbol)(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, uint32_t iSymbol,
    733753                           const char *pszSymbol, PFNKLDRMODGETIMPORT pfnGetForwarder, void *pvUser,
    734754                           PKLDRADDR puValue, uint32_t *pfKind);
  • TabularUnified trunk/kLdr/kLdrDyldMod.c

    r2856 r2859  
    881881 * pvUser points to the KLDRDYLDMOD.
    882882 */
    883 static int kldrDyldModFixupGetImportCallback(PKLDRMOD pMod, uint32_t iImport, uint32_t uSymbol, const char *pszSymbol,
     883static int kldrDyldModFixupGetImportCallback(PKLDRMOD pMod, uint32_t iImport, uint32_t iSymbol, const char *pszSymbol,
    884884                                             PKLDRADDR puValue, uint32_t *pfKind, void *pvUser)
    885885{
     
    907907
    908908        rc = kLdrModQuerySymbol(pPrereqMod->pMod, NULL, KLDRMOD_BASEADDRESS_MAP,
    909                                 uSymbol, pszSymbol, kldrDyldModFixupGetImportCallback, pPrereqMod, puValue, pfKind);
     909                                iSymbol, pszSymbol, kldrDyldModFixupGetImportCallback, pPrereqMod, puValue, pfKind);
    910910        if (rc)
    911911        {
     
    915915            else
    916916                kldrDyldFailure(rc, "%s[%d]->%s.%d", pDyldMod->pMod->pszName, iImport,
    917                                 pPrereqMod->pMod->pszName, uSymbol);
     917                                pPrereqMod->pMod->pszName, iSymbol);
    918918        }
    919919    }
     
    929929            KLDRADDR uValue;
    930930            rc = kLdrModQuerySymbol(pBindMod->pMod, NULL, KLDRMOD_BASEADDRESS_MAP,
    931                                     uSymbol, pszSymbol, kldrDyldModFixupGetImportCallback, pBindMod, &uValue, &fKind);
     931                                    iSymbol, pszSymbol, kldrDyldModFixupGetImportCallback, pBindMod, &uValue, &fKind);
    932932            if (    !rc
    933933                &&  (   !fFound
     
    952952                kldrDyldFailure(rc, "%s->%s", pDyldMod->pMod->pszName, pszSymbol);
    953953            else
    954                 kldrDyldFailure(rc, "%s->%d", pDyldMod->pMod->pszName, uSymbol);
     954                kldrDyldFailure(rc, "%s->%d", pDyldMod->pMod->pszName, iSymbol);
    955955        }
    956956    }
  • TabularUnified trunk/kLdr/kLdrMod.c

    r2858 r2859  
    260260 *                          There are two special values that can be used:
    261261 *                              KLDRMOD_BASEADDRESS_LINK and KLDRMOD_BASEADDRESS_MAP.
    262  * @param   uSymbol         The symbol ordinal. (optional)
     262 * @param   iSymbol         The symbol ordinal. (optional)
    263263 * @param   pszSymbol       The symbol name. (optional)
    264264 * @param   pfnGetForwarder The callback to use when resolving a forwarder symbol. This is optional
     
    268268 * @param   pfKind          Where to store the symbol kind. (optional)
    269269 */
    270 int     kLdrModQuerySymbol(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, uint32_t uSymbol,
     270int     kLdrModQuerySymbol(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, uint32_t iSymbol,
    271271                           const char *pszSymbol, PFNKLDRMODGETIMPORT pfnGetForwarder, void *pvUser,
    272272                           PKLDRADDR puValue, uint32_t *pfKind)
     
    279279    if (pfKind)
    280280        *pfKind = 0;
    281     return pMod->pOps->pfnQuerySymbol(pMod, pvBits, BaseAddress, uSymbol, pszSymbol, pfnGetForwarder, pvUser, puValue, pfKind);
     281    return pMod->pOps->pfnQuerySymbol(pMod, pvBits, BaseAddress, iSymbol, pszSymbol, pfnGetForwarder, pvUser, puValue, pfKind);
    282282}
    283283
  • TabularUnified trunk/kLdr/kLdrModPE.c

    r2858 r2859  
    193193        ||  (   s.FileHdr.SizeOfOptionalHeader != sizeof(IMAGE_OPTIONAL_HEADER32)
    194194             && s.FileHdr.SizeOfOptionalHeader != sizeof(IMAGE_OPTIONAL_HEADER64))
     195        ||  !(s.FileHdr.Characteristics & IMAGE_FILE_EXECUTABLE_IMAGE)
    195196       )
    196197        return KLDR_ERR_PE_BAD_FILE_HEADER;
     
    241242    }
    242243    pMod->enmFmt = KLDRFMT_PE;
     244    if (s.FileHdr.Characteristics & IMAGE_FILE_DLL)
     245        pMod->enmType = s.FileHdr.Characteristics & IMAGE_FILE_RELOCS_STRIPPED
     246            ? KLDRTYPE_SHARED_LIBRARY_RELOCATABLE
     247            : KLDRTYPE_SHARED_LIBRARY_FIXED;
     248    else
     249        pMod->enmType = s.FileHdr.Characteristics & IMAGE_FILE_RELOCS_STRIPPED
     250            ? KLDRTYPE_EXECUTABLE_RELOCATABLE
     251            : KLDRTYPE_EXECUTABLE_FIXED;
    243252    pMod->u32Magic = 0;     /* set upon success. */
    244253
     
    286295    pMod->aSegments[0].pchName = "TheHeaders";
    287296    pMod->aSegments[0].cchName = sizeof("TheHeaders") - 1;
     297    pMod->aSegments[0].enmProt = KLDRPROT_READONLY;
    288298    pMod->aSegments[0].cb = pModPE->Hdrs.OptionalHeader.SizeOfHeaders;
     299    pMod->aSegments[0].Alignment = pModPE->Hdrs.OptionalHeader.SectionAlignment;
    289300    pMod->aSegments[0].LinkAddress = pModPE->Hdrs.OptionalHeader.ImageBase;
    290     pMod->aSegments[0].MapAddress = NIL_KLDRADDR;
    291     pMod->aSegments[0].enmProt = KLDRPROT_READONLY;
     301    pMod->aSegments[0].offFile = 0;
     302    pMod->aSegments[0].cbFile = pModPE->Hdrs.OptionalHeader.SizeOfHeaders;
     303    pMod->aSegments[0].RVA = 0;
     304    if (pMod->cSegments > 1)
     305        pMod->aSegments[0].cbMapped = pModPE->aShdrs[0].VirtualAddress;
     306    else
     307        pMod->aSegments[0].cbMapped = pModPE->Hdrs.OptionalHeader.SizeOfHeaders;
     308    pMod->aSegments[0].MapAddress = 0;
    292309
    293310    /* The section headers. */
     
    295312    {
    296313        char *pch;
     314
     315        /* unused */
    297316        pMod->aSegments[i + 1].pvUser = NULL;
     317        pMod->aSegments[i + 1].MapAddress = 0;
     318
     319        /* name */
    298320        pMod->aSegments[i + 1].pchName = pch = &pModPE->aShdrs[i].Name[0];
    299321        cb = IMAGE_SIZEOF_SHORT_NAME;
     
    302324            cb--;
    303325        pMod->aSegments[i + 1].cchName = cb;
     326
     327        /* size and addresses */
    304328        if (!(pModPE->aShdrs[i].Characteristics & IMAGE_SCN_TYPE_NOLOAD))
    305329        {
    306             pMod->aSegments[i + 1].cb = pModPE->aShdrs[i].Misc.VirtualSize;
    307             pMod->aSegments[i + 1].LinkAddress = pModPE->aShdrs[i].VirtualAddress;
     330            pMod->aSegments[i + 1].cb          = pModPE->aShdrs[i].Misc.VirtualSize;
     331            pMod->aSegments[i + 1].LinkAddress = pModPE->aShdrs[i].VirtualAddress
     332                                               + pModPE->Hdrs.OptionalHeader.ImageBase;
     333            pMod->aSegments[i + 1].RVA         = pModPE->aShdrs[i].VirtualAddress;
     334            pMod->aSegments[i + 1].cbMapped    = pModPE->aShdrs[i].Misc.VirtualSize;
     335            if (i + 2 < pMod->cSegments)
     336                pMod->aSegments[i + 1].cbMapped= pModPE->aShdrs[i + 1].VirtualAddress
     337                                               - pModPE->aShdrs[i].VirtualAddress;
    308338        }
    309339        else
    310340        {
    311             pMod->aSegments[i + 1].cb = 0;
     341            pMod->aSegments[i + 1].cb          = 0;
     342            pMod->aSegments[i + 1].cbMapped    = 0;
    312343            pMod->aSegments[i + 1].LinkAddress = NIL_KLDRADDR;
     344            pMod->aSegments[i + 1].RVA         = 0;
    313345        }
    314         pMod->aSegments[i + 1].MapAddress = NIL_KLDRADDR;
     346
     347        /* file location */
     348        pMod->aSegments[i + 1].offFile = pModPE->aShdrs[i].PointerToRawData;
     349        pMod->aSegments[i + 1].cbFile = pModPE->aShdrs[i].SizeOfRawData;
     350        if (    pMod->aSegments[i + 1].cbMapped > 0 /* if mapped */
     351            &&  (KLDRSIZE)pMod->aSegments[i + 1].cbFile > pMod->aSegments[i + 1].cbMapped)
     352            pMod->aSegments[i + 1].cbFile = pMod->aSegments[i + 1].cbMapped;
     353
     354        /* protection */
    315355        switch (  pModPE->aShdrs[i].Characteristics
    316356                & (IMAGE_SCN_MEM_SHARED | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE))
     
    349389                break;
    350390        }
     391
     392        /* alignment. */
    351393        switch (pModPE->aShdrs[i].Characteristics & IMAGE_SCN_ALIGN_MASK)
    352394        {
    353             default: kldrHlpAssert(0);
    354             case 0:                             pMod->aSegments[i + 1].Alignment = 0; break;
     395            case 0: /* hope this is right... */
     396                pMod->aSegments[i + 1].Alignment = pModPE->Hdrs.OptionalHeader.SectionAlignment;
     397                break;
    355398            case IMAGE_SCN_ALIGN_1BYTES:        pMod->aSegments[i + 1].Alignment = 1; break;
    356399            case IMAGE_SCN_ALIGN_2BYTES:        pMod->aSegments[i + 1].Alignment = 2; break;
     
    367410            case IMAGE_SCN_ALIGN_4096BYTES:     pMod->aSegments[i + 1].Alignment = 4096; break;
    368411            case IMAGE_SCN_ALIGN_8192BYTES:     pMod->aSegments[i + 1].Alignment = 8192; break;
     412            default: kldrHlpAssert(0);          pMod->aSegments[i + 1].Alignment = 0; break;
    369413        }
    370414    }
     
    558602     * Get bits.
    559603     */
    560     if (!*ppvBits)
     604    if (ppvBits && !*ppvBits)
    561605    {
    562606        if (pModPE->pvMapping)
     
    576620
    577621/** @copydoc kLdrModQuerySymbol */
    578 static int kldrModPEQuerySymbol(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, uint32_t uSymbol,
     622static int kldrModPEQuerySymbol(PKLDRMOD pMod, const void *pvBits, KLDRADDR BaseAddress, uint32_t iSymbol,
    579623                                const char *pszSymbol, PFNKLDRMODGETIMPORT pfnGetForwarder, void *pvUser,
    580624                                PKLDRADDR puValue, uint32_t *pfKind)
     
    605649         * Simple, calculate the unbased ordinal and bounds check it.
    606650         */
    607         iExpOrd = uSymbol - pExpDir->Base;
     651        iExpOrd = iSymbol - pExpDir->Base;
    608652        if (iExpOrd >= KLDR_MAX(pExpDir->NumberOfNames, pExpDir->NumberOfFunctions))
    609653            return KLDR_ERR_SYMBOL_NOT_FOUND;
     
    702746    uint32_t        cchImpModule;
    703747    const char     *pszSymbol;
    704     uint32_t        uSymbol;
     748    uint32_t        iSymbol;
    705749    int             rc;
    706750
     
    738782
    739783        /* ascii to integer */
    740         uSymbol = 0;
     784        iSymbol = 0;
    741785        for (;;)
    742786        {
     
    757801
    758802            /* insert the digit */
    759             uSymbol *= uBase;
    760             uSymbol += uDigit;
     803            iSymbol *= uBase;
     804            iSymbol += uDigit;
    761805        }
    762806
     
    764808    }
    765809    else
    766         uSymbol = NIL_KLDRMOD_SYM_ORDINAL; /* no ordinal number. */
     810        iSymbol = NIL_KLDRMOD_SYM_ORDINAL; /* no ordinal number. */
    767811
    768812
     
    798842             * Now the rest is up to the callback (almost).
    799843             */
    800             rc = pfnGetForwarder(pModPE->pMod, iImpModule, uSymbol, pszSymbol, puValue, pfKind, pvUser);
     844            rc = pfnGetForwarder(pModPE->pMod, iImpModule, iSymbol, pszSymbol, puValue, pfKind, pvUser);
    801845            if (!rc && pfKind)
    802846                *pfKind |= KLDRSYMKIND_FORWARDER;
     
    831875    if (    pModPE->Hdrs.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size
    832876        <   sizeof(IMAGE_EXPORT_DIRECTORY))
    833         return KLDR_ERR_SYMBOL_NOT_FOUND;
     877        return 0; /* no exports to enumerate, return success. */
     878
    834879    pExpDir = KLDRMODPE_RVA2TYPE(pvBits,
    835880                                 pModPE->Hdrs.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress,
     
    863908        for (iName = 0; iName < cNames; iName++)
    864909        {
    865             if (!paOrdinals[iName] != iFunction)
     910            if (paOrdinals[iName] != iFunction)
    866911                continue;
    867912            fFoundName = 1;
    868             rc = pfnCallback(pMod, iName + pExpDir->Base, KLDRMODPE_RVA2TYPE(pvBits, paRVANames[iName], const char *),
     913            rc = pfnCallback(pMod, iFunction + pExpDir->Base, KLDRMODPE_RVA2TYPE(pvBits, paRVANames[iName], const char *),
    869914                             uValue, fKind, pvUser);
    870915            if (rc)
     
    877922        if (!fFoundName)
    878923        {
    879             rc = pfnCallback(pMod, iName + pExpDir->Base, NULL, uValue, fKind, pvUser);
     924            rc = pfnCallback(pMod, iFunction + pExpDir->Base, NULL, uValue, fKind, pvUser);
    880925            if (rc)
    881926                return rc;
     
    9581003            while (pImpDesc->Name && pImpDesc->FirstThunk)
    9591004            {
    960                 pModPE->cImportModules = 0;
     1005                pModPE->cImportModules++;
    9611006                pImpDesc++;
    9621007            }
Note: See TracChangeset for help on using the changeset viewer.