Changeset 2875 for trunk/kLdr/kLdrDyld.c


Ignore:
Timestamp:
Nov 12, 2006, 9:59:45 AM (19 years ago)
Author:
bird
Message:

Got the stub loader working (but without stack allocation/switching).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/kLdr/kLdrDyld.c

    r2874 r2875  
    9898uint32_t        kLdrDyldFlags = 0;
    9999/** The default search method. */
    100 KLDRDYLDSEARCH  kLdrDyldSearch = KLDRDYLD_SEARCH_INVALID;
     100KLDRDYLDSEARCH  kLdrDyldSearch = KLDRDYLD_SEARCH_HOST;
    101101
    102102
     
    146146 * @{ */
    147147void       kldrDyldDoLoadExeStackSwitch(PKLDRDYLDMOD pExe, void *pvStack, size_t cbStack);
    148 void       kldrDyldDoLoadExe(PKLDRDYLDMOD pExe);
    149148static int kldrDyldDoLoad(const char *pszDll, const char *pszPrefix, const char *pszSuffix, KLDRDYLDSEARCH enmSearch,
    150149                          unsigned fFlags, PPKLDRDYLDMOD ppMod, char *pszErr, size_t cchErr);
     
    229228 * @param   pvOS        OS specific argument.
    230229 */
    231 #ifndef __OS2__
    232 void kLdrDyldLoadExe(PKLDREXEARGS pArgs, void *pvOS)
     230#ifndef __OS2__  /* kLdrDyldLoadExe is implemented in assembly on OS/2. */
     231void kLdrDyldLoadExe(PCKLDREXEARGS pArgs, void *pvOS)
    233232#else
    234 void kldrDyldLoadExe(PKLDREXEARGS pArgs, void *pvOS)
     233void kldrDyldLoadExe(PCKLDREXEARGS pArgs, void *pvOS)
    235234#endif
    236235{
     
    241240
    242241    /*
    243      * Copy the arguments into the globals and do loader init (probably already initialized).
    244      */
    245     kLdrDyldFlags = pArgs->fFlags;
     242     * Indicate that we're boostrapping and ensure that initialization was successful.
     243     */
     244    g_fBootstrapping = 1;
     245    rc = kldrInit();
     246    if (rc)
     247        kldrDyldFailure(rc, "Init failure, rc=%d", rc);
     248
     249    /*
     250     * Validate the argument package.
     251     */
     252    if (pArgs->fFlags & ~(  KLDRYDLD_LOAD_FLAGS_GLOBAL_SYMBOLS
     253                          | KLDRYDLD_LOAD_FLAGS_DEEP_SYMBOLS
     254                          | KLDRDYLD_LOAD_FLAGS_RECURSIVE_INIT
     255                          | KLDRYDLD_LOAD_FLAGS_SPECIFIC_MODULE))
     256        kldrDyldFailure(KLDR_ERR_INVALID_PARAMETER, "Bad fFlags=%#x", pArgs->fFlags);
     257    if (    pArgs->enmSearch <= KLDRDYLD_SEARCH_INVALID
     258        ||  pArgs->enmSearch >= KLDRDYLD_SEARCH_END)
     259        kldrDyldFailure(KLDR_ERR_INVALID_PARAMETER, "Bad enmSearch=%d", pArgs->enmSearch);
     260
     261    /*
     262     * Set defaults.
     263     */
     264    kLdrDyldFlags |= (pArgs->fFlags & KLDRDYLD_LOAD_FLAGS_RECURSIVE_INIT);
    246265    kLdrDyldSearch = pArgs->enmSearch;
     266
     267    /** @todo make sense of this default prefix/suffix stuff. */
    247268    if (pArgs->szDefPrefix[0] != '\0')
    248269        kLdrHlpMemCopy(kLdrDyldDefPrefix, pArgs->szDefPrefix, KLDR_MIN(sizeof(pArgs->szDefPrefix), sizeof(kLdrDyldDefPrefix)));
    249270    if (pArgs->szDefSuffix[0] != '\0')
    250271        kLdrHlpMemCopy(kLdrDyldDefSuffix, pArgs->szDefSuffix, KLDR_MIN(sizeof(pArgs->szDefSuffix), sizeof(kLdrDyldDefSuffix)));
    251     /* append */ /** @todo create a function for doing this, an exposed api preferably. */
    252     cbStack = sizeof(kLdrDyldPath) - kLdrHlpStrLen(kLdrDyldPath); /* borrow cbStack for a itty bit. */
    253     kLdrHlpMemCopy(kLdrDyldPath, pArgs->szLibPath, KLDR_MIN(sizeof(pArgs->szLibPath), cbStack));
    254     kLdrDyldPath[sizeof(kLdrDyldPath) - 1] = '\0';
    255 
    256     g_fBootstrapping = 1;
    257     rc = kldrInit();
    258     if (rc)
    259         kldrDyldFailure(rc, "Init failure, rc=%d", rc);
     272
     273    /** @todo append that path to the one for the specified search method. */
     274    /** @todo create a function for doing this, an exposed api preferably. */
     275    /* append path */
     276    cbStack = sizeof(kLdrDyldLibraryPath) - kLdrHlpStrLen(kLdrDyldLibraryPath); /* borrow cbStack for a itty bit. */
     277    kLdrHlpMemCopy(kLdrDyldLibraryPath, pArgs->szLibPath, KLDR_MIN(sizeof(pArgs->szLibPath), cbStack));
     278    kLdrDyldLibraryPath[sizeof(kLdrDyldLibraryPath) - 1] = '\0';
    260279
    261280    /*
     
    269288     * Open and map the executable module before we join paths with kLdrDyldLoad().
    270289     */
    271     rc = kldrDyldFindNewModule(pArgs->szExecutable, NULL, NULL, kLdrDyldSearch,
    272                                kLdrDyldFlags | KLDRDYLD_LOAD_FLAGS_EXECUTABLE, &pExe);
     290    rc = kldrDyldFindNewModule(pArgs->szExecutable, NULL, NULL, pArgs->enmSearch,
     291                               pArgs->fFlags | KLDRDYLD_LOAD_FLAGS_EXECUTABLE, &pExe);
    273292    if (rc)
    274293        kldrDyldFailure(rc, "Can't find/open the executable '%s', rc=%d", pArgs->szExecutable, rc);
     
    745764    {
    746765        if (fFlags & KLDRDYLD_LOAD_FLAGS_EXECUTABLE)
    747             pLoadedMod->cDepRefs = 0xffff;
     766        {
     767            pLoadedMod->cDepRefs++; /* just make it stick. */
     768            pLoadedMod->cRefs++;
     769        }
    748770        else
    749771            rc = kldrDyldModDynamicLoad(pLoadedMod);
Note: See TracChangeset for help on using the changeset viewer.