Ignore:
Timestamp:
Nov 12, 2006, 6:38:28 AM (19 years ago)
Author:
bird
Message:

Test all kLdrDyld apis.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/kLdr/kLdrDyldMod.c

    r2869 r2870  
    8383    if (rc)
    8484        return kldrDyldFailure(rc, "%s: %rc", kLdrRdrName(pRdr), rc);
     85
     86    /*
     87     * Match the module aginst the load flags.
     88     */
     89    switch (pRawMod->enmType)
     90    {
     91        case KLDRTYPE_EXECUTABLE_FIXED:
     92        case KLDRTYPE_EXECUTABLE_RELOCATABLE:
     93        case KLDRTYPE_EXECUTABLE_PIC:
     94            if (!(fFlags & KLDRDYLD_LOAD_FLAGS_EXECUTABLE))
     95            {
     96                kLdrModClose(pRawMod);
     97                return KLDR_ERR_NOT_EXE;
     98            }
     99            break;
     100
     101        case KLDRTYPE_OBJECT: /* We can handle these as DLLs. */
     102        case KLDRTYPE_SHARED_LIBRARY_FIXED:
     103        case KLDRTYPE_SHARED_LIBRARY_RELOCATABLE:
     104        case KLDRTYPE_SHARED_LIBRARY_PIC:
     105        case KLDRTYPE_FORWARDER_DLL:
     106            if (fFlags & KLDRDYLD_LOAD_FLAGS_EXECUTABLE)
     107            {
     108                kLdrModClose(pRawMod);
     109                return KLDR_ERR_NOT_DLL;
     110            }
     111            break;
     112
     113        default:
     114            KLDRDYLDMOD_ASSERT(!"Bad enmType!");
     115        case KLDRTYPE_CORE:
     116            return fFlags & KLDRDYLD_LOAD_FLAGS_EXECUTABLE ? KLDR_ERR_NOT_EXE : KLDR_ERR_NOT_DLL;
     117    }
    85118
    86119    /*
     
    128161        kLdrDyldTail = pMod;
    129162
    130         /* we're good. */
     163        /* deal with the remaining flags. */
     164        if (fFlags & KLDRYDLD_LOAD_FLAGS_SPECIFIC_MODULE)
     165            kldrDyldModMarkSpecific(pMod);
     166        else
     167            kldrDyldModMarkGlobal(pMod);
     168
     169        if (fFlags & KLDRYDLD_LOAD_FLAGS_GLOBAL_SYMBOLS)
     170            kldrDyldModSetBindable(pMod, 0 /* not deep binable */);
     171        else
     172            kldrDyldModClearBindable(pMod);
     173
     174        /*
     175         * We're good.
     176         */
    131177        *ppMod = pMod;
    132178        rc = 0;
Note: See TracChangeset for help on using the changeset viewer.