Changeset 2850


Ignore:
Timestamp:
Nov 2, 2006, 3:28:29 AM (19 years ago)
Author:
bird
Message:

import resolving kldrDyldMod is nearly 100 complete now.

Location:
trunk/kLdr
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/kLdr/kLdr.h

    r2849 r2850  
    603603/** Valid symbol kind mask. */
    604604#define KLDRSYMKIND_MASK                    0x00000033
     605/** Weak symbol. */
     606#define KLDRSYMKIND_WEAK                    0x00000100
    605607/** @} */
    606608
     
    917919/** The specified ARCH+CPU isn't compatible with image. */
    918920#define KLDR_ERR_ARCH_CPU_NOT_COMPATIBLE                    (KLDR_ERR_BASE + 45)
     921/** Symbol not found. */
     922#define KLDR_ERR_SYMBOL_NOT_FOUND                           (KLDR_ERR_BASE + 46)
    919923
    920924/** Encountered a bad fixup. */
  • trunk/kLdr/kLdrDyldMod.c

    r2848 r2850  
    877877
    878878
     879/**
     880 * @copydoc FNKLDRMODGETIMPORT
     881 * pvUser points to the KLDRDYLDMOD.
     882 */
     883static int kldrDyldModFixupGetImportCallback(PKLDRMOD pMod, uint32_t iImport, uint32_t uSymbol, const char *pszSymbol,
     884                                             PKLDRADDR puValue, uint32_t *pfKind, void *pvUser)
     885{
     886    int rc;
     887    PKLDRDYLDMOD pDyldMod = (PKLDRDYLDMOD)pvUser;
     888
     889    if (iImport != NIL_KLDRMOD_IMPORT)
     890    {
     891        /* specific import module search. */
     892        PKLDRDYLDMOD pPrereqMod;
     893
     894        KLDRDYLDMOD_ASSERT(iImport < pDyldMod->cPrereqs);
     895        pPrereqMod = pDyldMod->papPrereqs[iImport];
     896
     897        KLDRDYLDMOD_ASSERT(pPrereqMod);
     898        KLDRDYLDMOD_ASSERT(pPrereqMod->u32MagicHead == KLDRDYMOD_MAGIC);
     899        KLDRDYLDMOD_ASSERT(pPrereqMod->u32MagicTail == KLDRDYMOD_MAGIC);
     900        KLDRDYLDMOD_ASSERT(pPrereqMod->enmState < KLDRSTATE_TERMINATING);
     901
     902        rc = kLdrModQuerySymbol(pPrereqMod->pMod, NULL, KLDRMOD_BASEADDRESS_MAP,
     903                                uSymbol, pszSymbol, puValue, pfKind);
     904        if (rc)
     905        {
     906            if (pszSymbol)
     907                kldrDyldFailure(rc, "%s[%d]->%s.%s", pDyldMod->pMod->pszName, iImport,
     908                                pPrereqMod->pMod->pszName, pszSymbol);
     909            else
     910                kldrDyldFailure(rc, "%s[%d]->%s.%d", pDyldMod->pMod->pszName, iImport,
     911                                pPrereqMod->pMod->pszName, uSymbol);
     912        }
     913    }
     914    else
     915    {
     916        /* bind list search. */
     917        unsigned fFound = 0;
     918        PKLDRDYLDMOD pBindMod = g_pkLdrDyldBindHead;
     919        rc = 0;
     920        while (pBindMod)
     921        {
     922            uint32_t fKind;
     923            KLDRADDR uValue;
     924            rc = kLdrModQuerySymbol(pBindMod->pMod, NULL, KLDRMOD_BASEADDRESS_MAP,
     925                                    uSymbol, pszSymbol, &uValue, &fKind);
     926            if (    !rc
     927                &&  (   !fFound
     928                     || !(fKind & KLDRSYMKIND_WEAK)
     929                    )
     930               )
     931            {
     932                *pfKind = fKind;
     933                *puValue = uValue;
     934                fFound = 1;
     935                if (!(fKind & KLDRSYMKIND_WEAK))
     936                    break;
     937            }
     938
     939            /* next */
     940            pBindMod = pBindMod->Bind.pNext;
     941        }
     942        rc = fFound ? 0 : KLDR_ERR_SYMBOL_NOT_FOUND;
     943        if (!fFound)
     944        {
     945            if (pszSymbol)
     946                kldrDyldFailure(rc, "%s->%s", pDyldMod->pMod->pszName, pszSymbol);
     947            else
     948                kldrDyldFailure(rc, "%s->%d", pDyldMod->pMod->pszName, uSymbol);
     949        }
     950    }
     951
     952    return rc;
     953}
     954
    879955
    880956/**
     
    895971
    896972    /* do the job */
    897     rc = kLdrModFixupMapping(pMod->pMod, NULL, NULL);/// @todo fixme.
     973    rc = kLdrModFixupMapping(pMod->pMod, kldrDyldModFixupGetImportCallback, pMod);/// @todo fixme.
    898974    if (!rc)
    899975        pMod->enmState = KLDRSTATE_FIXED_UP;
Note: See TracChangeset for help on using the changeset viewer.