Home | History | Annotate | Download | only in analysis
      1 /*
      2  * Copyright (C) 2008 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 /*
     18  * Prepare a DEX file for use by the VM.  Depending upon the VM options
     19  * we will attempt to verify and/or optimize the code, possibly appending
     20  * register maps.
     21  *
     22  * TODO: the format of the optimized header is currently "whatever we
     23  * happen to write", since the VM that writes it is by definition the same
     24  * as the VM that reads it.  Still, it should be better documented and
     25  * more rigorously structured.
     26  */
     27 #include "Dalvik.h"
     28 #include "libdex/OptInvocation.h"
     29 #include "analysis/RegisterMap.h"
     30 #include "analysis/Optimize.h"
     31 
     32 #include <string>
     33 
     34 #include <libgen.h>
     35 #include <stdlib.h>
     36 #include <unistd.h>
     37 #include <sys/mman.h>
     38 #include <sys/stat.h>
     39 #include <sys/file.h>
     40 #include <sys/stat.h>
     41 #include <sys/types.h>
     42 #include <sys/wait.h>
     43 #include <fcntl.h>
     44 #include <errno.h>
     45 #include <unistd.h>
     46 #include <zlib.h>
     47 
     48 /* fwd */
     49 static bool rewriteDex(u1* addr, int len, bool doVerify, bool doOpt,
     50     DexClassLookup** ppClassLookup, DvmDex** ppDvmDex);
     51 static bool loadAllClasses(DvmDex* pDvmDex);
     52 static void verifyAndOptimizeClasses(DexFile* pDexFile, bool doVerify,
     53     bool doOpt);
     54 static void verifyAndOptimizeClass(DexFile* pDexFile, ClassObject* clazz,
     55     const DexClassDef* pClassDef, bool doVerify, bool doOpt);
     56 static void updateChecksum(u1* addr, int len, DexHeader* pHeader);
     57 static int writeDependencies(int fd, u4 modWhen, u4 crc);
     58 static bool writeOptData(int fd, const DexClassLookup* pClassLookup,\
     59     const RegisterMapBuilder* pRegMapBuilder);
     60 static bool computeFileChecksum(int fd, off_t start, size_t length, u4* pSum);
     61 
     62 /*
     63  * Get just the directory portion of the given path. Equivalent to dirname(3).
     64  */
     65 static std::string saneDirName(const std::string& path) {
     66     size_t n = path.rfind('/');
     67     if (n == std::string::npos) {
     68         return ".";
     69     }
     70     return path.substr(0, n);
     71 }
     72 
     73 /*
     74  * Helper for dvmOpenCacheDexFile() in a known-error case: Check to
     75  * see if the directory part of the given path (all but the last
     76  * component) exists and is writable. Complain to the log if not.
     77  */
     78 static bool directoryIsValid(const std::string& fileName)
     79 {
     80     std::string dirName(saneDirName(fileName));
     81 
     82     struct stat sb;
     83     if (stat(dirName.c_str(), &sb) < 0) {
     84         ALOGE("Could not stat dex cache directory '%s': %s", dirName.c_str(), strerror(errno));
     85         return false;
     86     }
     87 
     88     if (!S_ISDIR(sb.st_mode)) {
     89         ALOGE("Dex cache directory isn't a directory: %s", dirName.c_str());
     90         return false;
     91     }
     92 
     93     if (access(dirName.c_str(), W_OK) < 0) {
     94         ALOGE("Dex cache directory isn't writable: %s", dirName.c_str());
     95         return false;
     96     }
     97 
     98     if (access(dirName.c_str(), R_OK) < 0) {
     99         ALOGE("Dex cache directory isn't readable: %s", dirName.c_str());
    100         return false;
    101     }
    102 
    103     return true;
    104 }
    105 
    106 /*
    107  * Return the fd of an open file in the DEX file cache area.  If the cache
    108  * file doesn't exist or is out of date, this will remove the old entry,
    109  * create a new one (writing only the file header), and return with the
    110  * "new file" flag set.
    111  *
    112  * It's possible to execute from an unoptimized DEX file directly,
    113  * assuming the byte ordering and structure alignment is correct, but
    114  * disadvantageous because some significant optimizations are not possible.
    115  * It's not generally possible to do the same from an uncompressed Jar
    116  * file entry, because we have to guarantee 32-bit alignment in the
    117  * memory-mapped file.
    118  *
    119  * For a Jar/APK file (a zip archive with "classes.dex" inside), "modWhen"
    120  * and "crc32" come from the Zip directory entry.  For a stand-alone DEX
    121  * file, it's the modification date of the file and the Adler32 from the
    122  * DEX header (which immediately follows the magic).  If these don't
    123  * match what's stored in the opt header, we reject the file immediately.
    124  *
    125  * On success, the file descriptor will be positioned just past the "opt"
    126  * file header, and will be locked with flock.  "*pCachedName" will point
    127  * to newly-allocated storage.
    128  */
    129 int dvmOpenCachedDexFile(const char* fileName, const char* cacheFileName,
    130     u4 modWhen, u4 crc, bool isBootstrap, bool* pNewFile, bool createIfMissing)
    131 {
    132     int fd, cc;
    133     struct stat fdStat, fileStat;
    134     bool readOnly = false;
    135 
    136     *pNewFile = false;
    137 
    138 retry:
    139     /*
    140      * Try to open the cache file.  If we've been asked to,
    141      * create it if it doesn't exist.
    142      */
    143     fd = createIfMissing ? open(cacheFileName, O_CREAT|O_RDWR, 0644) : -1;
    144     if (fd < 0) {
    145         fd = open(cacheFileName, O_RDONLY, 0);
    146         if (fd < 0) {
    147             if (createIfMissing) {
    148                 // TODO: write an equivalent of strerror_r that returns a std::string.
    149                 const std::string errnoString(strerror(errno));
    150                 if (directoryIsValid(cacheFileName)) {
    151                     ALOGE("Can't open dex cache file '%s': %s", cacheFileName, errnoString.c_str());
    152                 }
    153             }
    154             return fd;
    155         }
    156         readOnly = true;
    157     } else {
    158         fchmod(fd, 0644);
    159     }
    160 
    161     /*
    162      * Grab an exclusive lock on the cache file.  If somebody else is
    163      * working on it, we'll block here until they complete.  Because
    164      * we're waiting on an external resource, we go into VMWAIT mode.
    165      */
    166     ALOGV("DexOpt: locking cache file %s (fd=%d, boot=%d)",
    167         cacheFileName, fd, isBootstrap);
    168     ThreadStatus oldStatus = dvmChangeStatus(NULL, THREAD_VMWAIT);
    169     cc = flock(fd, LOCK_EX | LOCK_NB);
    170     if (cc != 0) {
    171         ALOGD("DexOpt: sleeping on flock(%s)", cacheFileName);
    172         cc = flock(fd, LOCK_EX);
    173     }
    174     dvmChangeStatus(NULL, oldStatus);
    175     if (cc != 0) {
    176         ALOGE("Can't lock dex cache '%s': %d", cacheFileName, cc);
    177         close(fd);
    178         return -1;
    179     }
    180     ALOGV("DexOpt:  locked cache file");
    181 
    182     /*
    183      * Check to see if the fd we opened and locked matches the file in
    184      * the filesystem.  If they don't, then somebody else unlinked ours
    185      * and created a new file, and we need to use that one instead.  (If
    186      * we caught them between the unlink and the create, we'll get an
    187      * ENOENT from the file stat.)
    188      */
    189     cc = fstat(fd, &fdStat);
    190     if (cc != 0) {
    191         ALOGE("Can't stat open file '%s'", cacheFileName);
    192         LOGVV("DexOpt: unlocking cache file %s", cacheFileName);
    193         goto close_fail;
    194     }
    195     cc = stat(cacheFileName, &fileStat);
    196     if (cc != 0 ||
    197         fdStat.st_dev != fileStat.st_dev || fdStat.st_ino != fileStat.st_ino)
    198     {
    199         ALOGD("DexOpt: our open cache file is stale; sleeping and retrying");
    200         LOGVV("DexOpt: unlocking cache file %s", cacheFileName);
    201         flock(fd, LOCK_UN);
    202         close(fd);
    203         usleep(250 * 1000);     /* if something is hosed, don't peg machine */
    204         goto retry;
    205     }
    206 
    207     /*
    208      * We have the correct file open and locked.  If the file size is zero,
    209      * then it was just created by us, and we want to fill in some fields
    210      * in the "opt" header and set "*pNewFile".  Otherwise, we want to
    211      * verify that the fields in the header match our expectations, and
    212      * reset the file if they don't.
    213      */
    214     if (fdStat.st_size == 0) {
    215         if (readOnly) {
    216             ALOGW("DexOpt: file has zero length and isn't writable");
    217             goto close_fail;
    218         }
    219         cc = dexOptCreateEmptyHeader(fd);
    220         if (cc != 0)
    221             goto close_fail;
    222         *pNewFile = true;
    223         ALOGV("DexOpt: successfully initialized new cache file");
    224     } else {
    225         bool expectVerify, expectOpt;
    226 
    227         if (gDvm.classVerifyMode == VERIFY_MODE_NONE) {
    228             expectVerify = false;
    229         } else if (gDvm.classVerifyMode == VERIFY_MODE_REMOTE) {
    230             expectVerify = !isBootstrap;
    231         } else /*if (gDvm.classVerifyMode == VERIFY_MODE_ALL)*/ {
    232             expectVerify = true;
    233         }
    234 
    235         if (gDvm.dexOptMode == OPTIMIZE_MODE_NONE) {
    236             expectOpt = false;
    237         } else if (gDvm.dexOptMode == OPTIMIZE_MODE_VERIFIED ||
    238                    gDvm.dexOptMode == OPTIMIZE_MODE_FULL) {
    239             expectOpt = expectVerify;
    240         } else /*if (gDvm.dexOptMode == OPTIMIZE_MODE_ALL)*/ {
    241             expectOpt = true;
    242         }
    243 
    244         ALOGV("checking deps, expecting vfy=%d opt=%d",
    245             expectVerify, expectOpt);
    246 
    247         if (!dvmCheckOptHeaderAndDependencies(fd, true, modWhen, crc,
    248                 expectVerify, expectOpt))
    249         {
    250             if (readOnly) {
    251                 /*
    252                  * We could unlink and rewrite the file if we own it or
    253                  * the "sticky" bit isn't set on the directory.  However,
    254                  * we're not able to truncate it, which spoils things.  So,
    255                  * give up now.
    256                  */
    257                 if (createIfMissing) {
    258                     ALOGW("Cached DEX '%s' (%s) is stale and not writable",
    259                         fileName, cacheFileName);
    260                 }
    261                 goto close_fail;
    262             }
    263 
    264             /*
    265              * If we truncate the existing file before unlinking it, any
    266              * process that has it mapped will fail when it tries to touch
    267              * the pages.
    268              *
    269              * This is very important.  The zygote process will have the
    270              * boot DEX files (core, framework, etc.) mapped early.  If
    271              * (say) core.dex gets updated, and somebody launches an app
    272              * that uses App.dex, then App.dex gets reoptimized because it's
    273              * dependent upon the boot classes.  However, dexopt will be
    274              * using the *new* core.dex to do the optimizations, while the
    275              * app will actually be running against the *old* core.dex
    276              * because it starts from zygote.
    277              *
    278              * Even without zygote, it's still possible for a class loader
    279              * to pull in an APK that was optimized against an older set
    280              * of DEX files.  We must ensure that everything fails when a
    281              * boot DEX gets updated, and for general "why aren't my
    282              * changes doing anything" purposes its best if we just make
    283              * everything crash when a DEX they're using gets updated.
    284              */
    285             ALOGD("ODEX file is stale or bad; removing and retrying (%s)",
    286                 cacheFileName);
    287             if (ftruncate(fd, 0) != 0) {
    288                 ALOGW("Warning: unable to truncate cache file '%s': %s",
    289                     cacheFileName, strerror(errno));
    290                 /* keep going */
    291             }
    292             if (unlink(cacheFileName) != 0) {
    293                 ALOGW("Warning: unable to remove cache file '%s': %d %s",
    294                     cacheFileName, errno, strerror(errno));
    295                 /* keep going; permission failure should probably be fatal */
    296             }
    297             LOGVV("DexOpt: unlocking cache file %s", cacheFileName);
    298             flock(fd, LOCK_UN);
    299             close(fd);
    300             goto retry;
    301         } else {
    302             ALOGV("DexOpt: good deps in cache file");
    303         }
    304     }
    305 
    306     assert(fd >= 0);
    307     return fd;
    308 
    309 close_fail:
    310     flock(fd, LOCK_UN);
    311     close(fd);
    312     return -1;
    313 }
    314 
    315 /*
    316  * Unlock the file descriptor.
    317  *
    318  * Returns "true" on success.
    319  */
    320 bool dvmUnlockCachedDexFile(int fd)
    321 {
    322     LOGVV("DexOpt: unlocking cache file fd=%d", fd);
    323     return (flock(fd, LOCK_UN) == 0);
    324 }
    325 
    326 
    327 /*
    328  * Given a descriptor for a file with DEX data in it, produce an
    329  * optimized version.
    330  *
    331  * The file pointed to by "fd" is expected to be a locked shared resource
    332  * (or private); we make no efforts to enforce multi-process correctness
    333  * here.
    334  *
    335  * "fileName" is only used for debug output.  "modWhen" and "crc" are stored
    336  * in the dependency set.
    337  *
    338  * The "isBootstrap" flag determines how the optimizer and verifier handle
    339  * package-scope access checks.  When optimizing, we only load the bootstrap
    340  * class DEX files and the target DEX, so the flag determines whether the
    341  * target DEX classes are given a (synthetic) non-NULL classLoader pointer.
    342  * This only really matters if the target DEX contains classes that claim to
    343  * be in the same package as bootstrap classes.
    344  *
    345  * The optimizer will need to load every class in the target DEX file.
    346  * This is generally undesirable, so we start a subprocess to do the
    347  * work and wait for it to complete.
    348  *
    349  * Returns "true" on success.  All data will have been written to "fd".
    350  */
    351 bool dvmOptimizeDexFile(int fd, off_t dexOffset, long dexLength,
    352     const char* fileName, u4 modWhen, u4 crc, bool isBootstrap)
    353 {
    354     const char* lastPart = strrchr(fileName, '/');
    355     if (lastPart != NULL)
    356         lastPart++;
    357     else
    358         lastPart = fileName;
    359 
    360     ALOGD("DexOpt: --- BEGIN '%s' (bootstrap=%d) ---", lastPart, isBootstrap);
    361 
    362     pid_t pid;
    363 
    364     /*
    365      * This could happen if something in our bootclasspath, which we thought
    366      * was all optimized, got rejected.
    367      */
    368     if (gDvm.optimizing) {
    369         ALOGW("Rejecting recursive optimization attempt on '%s'", fileName);
    370         return false;
    371     }
    372 
    373     pid = fork();
    374     if (pid == 0) {
    375         static const int kUseValgrind = 0;
    376         static const char* kDexOptBin = "/bin/dexopt";
    377         static const char* kValgrinder = "/usr/bin/valgrind";
    378         static const int kFixedArgCount = 10;
    379         static const int kValgrindArgCount = 5;
    380         static const int kMaxIntLen = 12;   // '-'+10dig+'\0' -OR- 0x+8dig
    381         int bcpSize = dvmGetBootPathSize();
    382         int argc = kFixedArgCount + bcpSize
    383             + (kValgrindArgCount * kUseValgrind);
    384         const char* argv[argc+1];             // last entry is NULL
    385         char values[argc][kMaxIntLen];
    386         char* execFile;
    387         const char* androidRoot;
    388         int flags;
    389 
    390         /* change process groups, so we don't clash with ProcessManager */
    391         setpgid(0, 0);
    392 
    393         /* full path to optimizer */
    394         androidRoot = getenv("ANDROID_ROOT");
    395         if (androidRoot == NULL) {
    396             ALOGW("ANDROID_ROOT not set, defaulting to /system");
    397             androidRoot = "/system";
    398         }
    399         execFile = (char*)alloca(strlen(androidRoot) + strlen(kDexOptBin) + 1);
    400         strcpy(execFile, androidRoot);
    401         strcat(execFile, kDexOptBin);
    402 
    403         /*
    404          * Create arg vector.
    405          */
    406         int curArg = 0;
    407 
    408         if (kUseValgrind) {
    409             /* probably shouldn't ship the hard-coded path */
    410             argv[curArg++] = (char*)kValgrinder;
    411             argv[curArg++] = "--tool=memcheck";
    412             argv[curArg++] = "--leak-check=yes";        // check for leaks too
    413             argv[curArg++] = "--leak-resolution=med";   // increase from 2 to 4
    414             argv[curArg++] = "--num-callers=16";        // default is 12
    415             assert(curArg == kValgrindArgCount);
    416         }
    417         argv[curArg++] = execFile;
    418 
    419         argv[curArg++] = "--dex";
    420 
    421         sprintf(values[2], "%d", DALVIK_VM_BUILD);
    422         argv[curArg++] = values[2];
    423 
    424         sprintf(values[3], "%d", fd);
    425         argv[curArg++] = values[3];
    426 
    427         sprintf(values[4], "%d", (int) dexOffset);
    428         argv[curArg++] = values[4];
    429 
    430         sprintf(values[5], "%d", (int) dexLength);
    431         argv[curArg++] = values[5];
    432 
    433         argv[curArg++] = (char*)fileName;
    434 
    435         sprintf(values[7], "%d", (int) modWhen);
    436         argv[curArg++] = values[7];
    437 
    438         sprintf(values[8], "%d", (int) crc);
    439         argv[curArg++] = values[8];
    440 
    441         flags = 0;
    442         if (gDvm.dexOptMode != OPTIMIZE_MODE_NONE) {
    443             flags |= DEXOPT_OPT_ENABLED;
    444             if (gDvm.dexOptMode == OPTIMIZE_MODE_ALL)
    445                 flags |= DEXOPT_OPT_ALL;
    446         }
    447         if (gDvm.classVerifyMode != VERIFY_MODE_NONE) {
    448             flags |= DEXOPT_VERIFY_ENABLED;
    449             if (gDvm.classVerifyMode == VERIFY_MODE_ALL)
    450                 flags |= DEXOPT_VERIFY_ALL;
    451         }
    452         if (isBootstrap)
    453             flags |= DEXOPT_IS_BOOTSTRAP;
    454         if (gDvm.generateRegisterMaps)
    455             flags |= DEXOPT_GEN_REGISTER_MAPS;
    456         sprintf(values[9], "%d", flags);
    457         argv[curArg++] = values[9];
    458 
    459         assert(((!kUseValgrind && curArg == kFixedArgCount) ||
    460                ((kUseValgrind && curArg == kFixedArgCount+kValgrindArgCount))));
    461 
    462         ClassPathEntry* cpe;
    463         for (cpe = gDvm.bootClassPath; cpe->ptr != NULL; cpe++) {
    464             argv[curArg++] = cpe->fileName;
    465         }
    466         assert(curArg == argc);
    467 
    468         argv[curArg] = NULL;
    469 
    470         if (kUseValgrind)
    471             execv(kValgrinder, const_cast<char**>(argv));
    472         else
    473             execv(execFile, const_cast<char**>(argv));
    474 
    475         ALOGE("execv '%s'%s failed: %s", execFile,
    476             kUseValgrind ? " [valgrind]" : "", strerror(errno));
    477         exit(1);
    478     } else {
    479         ALOGV("DexOpt: waiting for verify+opt, pid=%d", (int) pid);
    480         int status;
    481         pid_t gotPid;
    482 
    483         /*
    484          * Wait for the optimization process to finish.  We go into VMWAIT
    485          * mode here so GC suspension won't have to wait for us.
    486          */
    487         ThreadStatus oldStatus = dvmChangeStatus(NULL, THREAD_VMWAIT);
    488         while (true) {
    489             gotPid = waitpid(pid, &status, 0);
    490             if (gotPid == -1 && errno == EINTR) {
    491                 ALOGD("waitpid interrupted, retrying");
    492             } else {
    493                 break;
    494             }
    495         }
    496         dvmChangeStatus(NULL, oldStatus);
    497         if (gotPid != pid) {
    498             ALOGE("waitpid failed: wanted %d, got %d: %s",
    499                 (int) pid, (int) gotPid, strerror(errno));
    500             return false;
    501         }
    502 
    503         if (WIFEXITED(status) && WEXITSTATUS(status) == 0) {
    504             ALOGD("DexOpt: --- END '%s' (success) ---", lastPart);
    505             return true;
    506         } else {
    507             ALOGW("DexOpt: --- END '%s' --- status=0x%04x, process failed",
    508                 lastPart, status);
    509             return false;
    510         }
    511     }
    512 }
    513 
    514 /*
    515  * Do the actual optimization.  This is executed in the dexopt process.
    516  *
    517  * For best use of disk/memory, we want to extract once and perform
    518  * optimizations in place.  If the file has to expand or contract
    519  * to match local structure padding/alignment expectations, we want
    520  * to do the rewrite as part of the extract, rather than extracting
    521  * into a temp file and slurping it back out.  (The structure alignment
    522  * is currently correct for all platforms, and this isn't expected to
    523  * change, so we should be okay with having it already extracted.)
    524  *
    525  * Returns "true" on success.
    526  */
    527 bool dvmContinueOptimization(int fd, off_t dexOffset, long dexLength,
    528     const char* fileName, u4 modWhen, u4 crc, bool isBootstrap)
    529 {
    530     DexClassLookup* pClassLookup = NULL;
    531     RegisterMapBuilder* pRegMapBuilder = NULL;
    532 
    533     assert(gDvm.optimizing);
    534 
    535     ALOGV("Continuing optimization (%s, isb=%d)", fileName, isBootstrap);
    536 
    537     assert(dexOffset >= 0);
    538 
    539     /* quick test so we don't blow up on empty file */
    540     if (dexLength < (int) sizeof(DexHeader)) {
    541         ALOGE("too small to be DEX");
    542         return false;
    543     }
    544     if (dexOffset < (int) sizeof(DexOptHeader)) {
    545         ALOGE("not enough room for opt header");
    546         return false;
    547     }
    548 
    549     bool result = false;
    550 
    551     /*
    552      * Drop this into a global so we don't have to pass it around.  We could
    553      * also add a field to DexFile, but since it only pertains to DEX
    554      * creation that probably doesn't make sense.
    555      */
    556     gDvm.optimizingBootstrapClass = isBootstrap;
    557 
    558     {
    559         /*
    560          * Map the entire file (so we don't have to worry about page
    561          * alignment).  The expectation is that the output file contains
    562          * our DEX data plus room for a small header.
    563          */
    564         bool success;
    565         void* mapAddr;
    566         mapAddr = mmap(NULL, dexOffset + dexLength, PROT_READ|PROT_WRITE,
    567                     MAP_SHARED, fd, 0);
    568         if (mapAddr == MAP_FAILED) {
    569             ALOGE("unable to mmap DEX cache: %s", strerror(errno));
    570             goto bail;
    571         }
    572 
    573         bool doVerify, doOpt;
    574         if (gDvm.classVerifyMode == VERIFY_MODE_NONE) {
    575             doVerify = false;
    576         } else if (gDvm.classVerifyMode == VERIFY_MODE_REMOTE) {
    577             doVerify = !gDvm.optimizingBootstrapClass;
    578         } else /*if (gDvm.classVerifyMode == VERIFY_MODE_ALL)*/ {
    579             doVerify = true;
    580         }
    581 
    582         if (gDvm.dexOptMode == OPTIMIZE_MODE_NONE) {
    583             doOpt = false;
    584         } else if (gDvm.dexOptMode == OPTIMIZE_MODE_VERIFIED ||
    585                    gDvm.dexOptMode == OPTIMIZE_MODE_FULL) {
    586             doOpt = doVerify;
    587         } else /*if (gDvm.dexOptMode == OPTIMIZE_MODE_ALL)*/ {
    588             doOpt = true;
    589         }
    590 
    591         /*
    592          * Rewrite the file.  Byte reordering, structure realigning,
    593          * class verification, and bytecode optimization are all performed
    594          * here.
    595          *
    596          * In theory the file could change size and bits could shift around.
    597          * In practice this would be annoying to deal with, so the file
    598          * layout is designed so that it can always be rewritten in place.
    599          *
    600          * This creates the class lookup table as part of doing the processing.
    601          */
    602         success = rewriteDex(((u1*) mapAddr) + dexOffset, dexLength,
    603                     doVerify, doOpt, &pClassLookup, NULL);
    604 
    605         if (success) {
    606             DvmDex* pDvmDex = NULL;
    607             u1* dexAddr = ((u1*) mapAddr) + dexOffset;
    608 
    609             if (dvmDexFileOpenPartial(dexAddr, dexLength, &pDvmDex) != 0) {
    610                 ALOGE("Unable to create DexFile");
    611                 success = false;
    612             } else {
    613                 /*
    614                  * If configured to do so, generate register map output
    615                  * for all verified classes.  The register maps were
    616                  * generated during verification, and will now be serialized.
    617                  */
    618                 if (gDvm.generateRegisterMaps) {
    619                     pRegMapBuilder = dvmGenerateRegisterMaps(pDvmDex);
    620                     if (pRegMapBuilder == NULL) {
    621                         ALOGE("Failed generating register maps");
    622                         success = false;
    623                     }
    624                 }
    625 
    626                 DexHeader* pHeader = (DexHeader*)pDvmDex->pHeader;
    627                 updateChecksum(dexAddr, dexLength, pHeader);
    628 
    629                 dvmDexFileFree(pDvmDex);
    630             }
    631         }
    632 
    633         /* unmap the read-write version, forcing writes to disk */
    634         if (msync(mapAddr, dexOffset + dexLength, MS_SYNC) != 0) {
    635             ALOGW("msync failed: %s", strerror(errno));
    636             // weird, but keep going
    637         }
    638 #if 1
    639         /*
    640          * This causes clean shutdown to fail, because we have loaded classes
    641          * that point into it.  For the optimizer this isn't a problem,
    642          * because it's more efficient for the process to simply exit.
    643          * Exclude this code when doing clean shutdown for valgrind.
    644          */
    645         if (munmap(mapAddr, dexOffset + dexLength) != 0) {
    646             ALOGE("munmap failed: %s", strerror(errno));
    647             goto bail;
    648         }
    649 #endif
    650 
    651         if (!success)
    652             goto bail;
    653     }
    654 
    655     /* get start offset, and adjust deps start for 64-bit alignment */
    656     off_t depsOffset, optOffset, endOffset, adjOffset;
    657     int depsLength, optLength;
    658     u4 optChecksum;
    659 
    660     depsOffset = lseek(fd, 0, SEEK_END);
    661     if (depsOffset < 0) {
    662         ALOGE("lseek to EOF failed: %s", strerror(errno));
    663         goto bail;
    664     }
    665     adjOffset = (depsOffset + 7) & ~(0x07);
    666     if (adjOffset != depsOffset) {
    667         ALOGV("Adjusting deps start from %d to %d",
    668             (int) depsOffset, (int) adjOffset);
    669         depsOffset = adjOffset;
    670         lseek(fd, depsOffset, SEEK_SET);
    671     }
    672 
    673     /*
    674      * Append the dependency list.
    675      */
    676     if (writeDependencies(fd, modWhen, crc) != 0) {
    677         ALOGW("Failed writing dependencies");
    678         goto bail;
    679     }
    680 
    681     /* compute deps length, then adjust opt start for 64-bit alignment */
    682     optOffset = lseek(fd, 0, SEEK_END);
    683     depsLength = optOffset - depsOffset;
    684 
    685     adjOffset = (optOffset + 7) & ~(0x07);
    686     if (adjOffset != optOffset) {
    687         ALOGV("Adjusting opt start from %d to %d",
    688             (int) optOffset, (int) adjOffset);
    689         optOffset = adjOffset;
    690         lseek(fd, optOffset, SEEK_SET);
    691     }
    692 
    693     /*
    694      * Append any optimized pre-computed data structures.
    695      */
    696     if (!writeOptData(fd, pClassLookup, pRegMapBuilder)) {
    697         ALOGW("Failed writing opt data");
    698         goto bail;
    699     }
    700 
    701     endOffset = lseek(fd, 0, SEEK_END);
    702     optLength = endOffset - optOffset;
    703 
    704     /* compute checksum from start of deps to end of opt area */
    705     if (!computeFileChecksum(fd, depsOffset,
    706             (optOffset+optLength) - depsOffset, &optChecksum))
    707     {
    708         goto bail;
    709     }
    710 
    711     /*
    712      * Output the "opt" header with all values filled in and a correct
    713      * magic number.
    714      */
    715     DexOptHeader optHdr;
    716     memset(&optHdr, 0xff, sizeof(optHdr));
    717     memcpy(optHdr.magic, DEX_OPT_MAGIC, 4);
    718     memcpy(optHdr.magic+4, DEX_OPT_MAGIC_VERS, 4);
    719     optHdr.dexOffset = (u4) dexOffset;
    720     optHdr.dexLength = (u4) dexLength;
    721     optHdr.depsOffset = (u4) depsOffset;
    722     optHdr.depsLength = (u4) depsLength;
    723     optHdr.optOffset = (u4) optOffset;
    724     optHdr.optLength = (u4) optLength;
    725 #if __BYTE_ORDER != __LITTLE_ENDIAN
    726     optHdr.flags = DEX_OPT_FLAG_BIG;
    727 #else
    728     optHdr.flags = 0;
    729 #endif
    730     optHdr.checksum = optChecksum;
    731 
    732     fsync(fd);      /* ensure previous writes go before header is written */
    733 
    734     lseek(fd, 0, SEEK_SET);
    735     if (sysWriteFully(fd, &optHdr, sizeof(optHdr), "DexOpt opt header") != 0)
    736         goto bail;
    737 
    738     ALOGV("Successfully wrote DEX header");
    739     result = true;
    740 
    741     //dvmRegisterMapDumpStats();
    742 
    743 bail:
    744     dvmFreeRegisterMapBuilder(pRegMapBuilder);
    745     free(pClassLookup);
    746     return result;
    747 }
    748 
    749 /*
    750  * Prepare an in-memory DEX file.
    751  *
    752  * The data was presented to the VM as a byte array rather than a file.
    753  * We want to do the same basic set of operations, but we can just leave
    754  * them in memory instead of writing them out to a cached optimized DEX file.
    755  */
    756 bool dvmPrepareDexInMemory(u1* addr, size_t len, DvmDex** ppDvmDex)
    757 {
    758     DexClassLookup* pClassLookup = NULL;
    759 
    760     /*
    761      * Byte-swap, realign, verify basic DEX file structure.
    762      *
    763      * We could load + verify + optimize here as well, but that's probably
    764      * not desirable.
    765      *
    766      * (The bulk-verification code is currently only setting the DEX
    767      * file's "verified" flag, not updating the ClassObject.  This would
    768      * also need to be changed, or we will try to verify the class twice,
    769      * and possibly reject it when optimized opcodes are encountered.)
    770      */
    771     if (!rewriteDex(addr, len, false, false, &pClassLookup, ppDvmDex)) {
    772         return false;
    773     }
    774 
    775     (*ppDvmDex)->pDexFile->pClassLookup = pClassLookup;
    776 
    777     return true;
    778 }
    779 
    780 /*
    781  * Perform in-place rewrites on a memory-mapped DEX file.
    782  *
    783  * If this is called from a short-lived child process (dexopt), we can
    784  * go nutty with loading classes and allocating memory.  When it's
    785  * called to prepare classes provided in a byte array, we may want to
    786  * be more conservative.
    787  *
    788  * If "ppClassLookup" is non-NULL, a pointer to a newly-allocated
    789  * DexClassLookup will be returned on success.
    790  *
    791  * If "ppDvmDex" is non-NULL, a newly-allocated DvmDex struct will be
    792  * returned on success.
    793  */
    794 static bool rewriteDex(u1* addr, int len, bool doVerify, bool doOpt,
    795     DexClassLookup** ppClassLookup, DvmDex** ppDvmDex)
    796 {
    797     DexClassLookup* pClassLookup = NULL;
    798     u8 prepWhen, loadWhen, verifyOptWhen;
    799     DvmDex* pDvmDex = NULL;
    800     bool result = false;
    801     const char* msgStr = "???";
    802 
    803     /* if the DEX is in the wrong byte order, swap it now */
    804     if (dexSwapAndVerify(addr, len) != 0)
    805         goto bail;
    806 
    807     /*
    808      * Now that the DEX file can be read directly, create a DexFile struct
    809      * for it.
    810      */
    811     if (dvmDexFileOpenPartial(addr, len, &pDvmDex) != 0) {
    812         ALOGE("Unable to create DexFile");
    813         goto bail;
    814     }
    815 
    816     /*
    817      * Create the class lookup table.  This will eventually be appended
    818      * to the end of the .odex.
    819      *
    820      * We create a temporary link from the DexFile for the benefit of
    821      * class loading, below.
    822      */
    823     pClassLookup = dexCreateClassLookup(pDvmDex->pDexFile);
    824     if (pClassLookup == NULL)
    825         goto bail;
    826     pDvmDex->pDexFile->pClassLookup = pClassLookup;
    827 
    828     /*
    829      * If we're not going to attempt to verify or optimize the classes,
    830      * there's no value in loading them, so bail out early.
    831      */
    832     if (!doVerify && !doOpt) {
    833         result = true;
    834         goto bail;
    835     }
    836 
    837     prepWhen = dvmGetRelativeTimeUsec();
    838 
    839     /*
    840      * Load all classes found in this DEX file.  If they fail to load for
    841      * some reason, they won't get verified (which is as it should be).
    842      */
    843     if (!loadAllClasses(pDvmDex))
    844         goto bail;
    845     loadWhen = dvmGetRelativeTimeUsec();
    846 
    847     /*
    848      * Create a data structure for use by the bytecode optimizer.
    849      * We need to look up methods in a few classes, so this may cause
    850      * a bit of class loading.  We usually do this during VM init, but
    851      * for dexopt on core.jar the order of operations gets a bit tricky,
    852      * so we defer it to here.
    853      */
    854     if (!dvmCreateInlineSubsTable())
    855         goto bail;
    856 
    857     /*
    858      * Verify and optimize all classes in the DEX file (command-line
    859      * options permitting).
    860      *
    861      * This is best-effort, so there's really no way for dexopt to
    862      * fail at this point.
    863      */
    864     verifyAndOptimizeClasses(pDvmDex->pDexFile, doVerify, doOpt);
    865     verifyOptWhen = dvmGetRelativeTimeUsec();
    866 
    867     if (doVerify && doOpt)
    868         msgStr = "verify+opt";
    869     else if (doVerify)
    870         msgStr = "verify";
    871     else if (doOpt)
    872         msgStr = "opt";
    873     ALOGD("DexOpt: load %dms, %s %dms, %d bytes",
    874         (int) (loadWhen - prepWhen) / 1000,
    875         msgStr,
    876         (int) (verifyOptWhen - loadWhen) / 1000,
    877         gDvm.pBootLoaderAlloc->curOffset);
    878 
    879     result = true;
    880 
    881 bail:
    882     /*
    883      * On success, return the pieces that the caller asked for.
    884      */
    885 
    886     if (pDvmDex != NULL) {
    887         /* break link between the two */
    888         pDvmDex->pDexFile->pClassLookup = NULL;
    889     }
    890 
    891     if (ppDvmDex == NULL || !result) {
    892         dvmDexFileFree(pDvmDex);
    893     } else {
    894         *ppDvmDex = pDvmDex;
    895     }
    896 
    897     if (ppClassLookup == NULL || !result) {
    898         free(pClassLookup);
    899     } else {
    900         *ppClassLookup = pClassLookup;
    901     }
    902 
    903     return result;
    904 }
    905 
    906 /*
    907  * Try to load all classes in the specified DEX.  If they have some sort
    908  * of broken dependency, e.g. their superclass lives in a different DEX
    909  * that wasn't previously loaded into the bootstrap class path, loading
    910  * will fail.  This is the desired behavior.
    911  *
    912  * We have no notion of class loader at this point, so we load all of
    913  * the classes with the bootstrap class loader.  It turns out this has
    914  * exactly the behavior we want, and has no ill side effects because we're
    915  * running in a separate process and anything we load here will be forgotten.
    916  *
    917  * We set the CLASS_MULTIPLE_DEFS flag here if we see multiple definitions.
    918  * This works because we only call here as part of optimization / pre-verify,
    919  * not during verification as part of loading a class into a running VM.
    920  *
    921  * This returns "false" if the world is too screwed up to do anything
    922  * useful at all.
    923  */
    924 static bool loadAllClasses(DvmDex* pDvmDex)
    925 {
    926     u4 count = pDvmDex->pDexFile->pHeader->classDefsSize;
    927     u4 idx;
    928     int loaded = 0;
    929 
    930     ALOGV("DexOpt: +++ trying to load %d classes", count);
    931 
    932     dvmSetBootPathExtraDex(pDvmDex);
    933 
    934     /*
    935      * At this point, it is safe -- and necessary! -- to look up the
    936      * VM's required classes and members, even when what we are in the
    937      * process of processing is the core library that defines these
    938      * classes itself. (The reason it is necessary is that in the act
    939      * of initializing the class Class, below, the system will end up
    940      * referring to many of the class references that got set up by
    941      * this call.)
    942      */
    943     if (!dvmFindRequiredClassesAndMembers()) {
    944         return false;
    945     }
    946 
    947     /*
    948      * We have some circularity issues with Class and Object that are
    949      * most easily avoided by ensuring that Object is never the first
    950      * thing we try to find-and-initialize. The call to
    951      * dvmFindSystemClass() here takes care of that situation. (We
    952      * only need to do this when loading classes from the DEX file
    953      * that contains Object, and only when Object comes first in the
    954      * list, but it costs very little to do it in all cases.)
    955      */
    956     if (!dvmInitClass(gDvm.classJavaLangClass)) {
    957         ALOGE("ERROR: failed to initialize the class Class!");
    958         return false;
    959     }
    960 
    961     for (idx = 0; idx < count; idx++) {
    962         const DexClassDef* pClassDef;
    963         const char* classDescriptor;
    964         ClassObject* newClass;
    965 
    966         pClassDef = dexGetClassDef(pDvmDex->pDexFile, idx);
    967         classDescriptor =
    968             dexStringByTypeIdx(pDvmDex->pDexFile, pClassDef->classIdx);
    969 
    970         ALOGV("+++  loading '%s'", classDescriptor);
    971         //newClass = dvmDefineClass(pDexFile, classDescriptor,
    972         //        NULL);
    973         newClass = dvmFindSystemClassNoInit(classDescriptor);
    974         if (newClass == NULL) {
    975             ALOGV("DexOpt: failed loading '%s'", classDescriptor);
    976             dvmClearOptException(dvmThreadSelf());
    977         } else if (newClass->pDvmDex != pDvmDex) {
    978             /*
    979              * We don't load the new one, and we tag the first one found
    980              * with the "multiple def" flag so the resolver doesn't try
    981              * to make it available.
    982              */
    983             ALOGD("DexOpt: '%s' has an earlier definition; blocking out",
    984                 classDescriptor);
    985             SET_CLASS_FLAG(newClass, CLASS_MULTIPLE_DEFS);
    986         } else {
    987             loaded++;
    988         }
    989     }
    990     ALOGV("DexOpt: +++ successfully loaded %d classes", loaded);
    991 
    992     dvmSetBootPathExtraDex(NULL);
    993     return true;
    994 }
    995 
    996 /*
    997  * Verify and/or optimize all classes that were successfully loaded from
    998  * this DEX file.
    999  */
   1000 static void verifyAndOptimizeClasses(DexFile* pDexFile, bool doVerify,
   1001     bool doOpt)
   1002 {
   1003     u4 count = pDexFile->pHeader->classDefsSize;
   1004     u4 idx;
   1005 
   1006     for (idx = 0; idx < count; idx++) {
   1007         const DexClassDef* pClassDef;
   1008         const char* classDescriptor;
   1009         ClassObject* clazz;
   1010 
   1011         pClassDef = dexGetClassDef(pDexFile, idx);
   1012         classDescriptor = dexStringByTypeIdx(pDexFile, pClassDef->classIdx);
   1013 
   1014         /* all classes are loaded into the bootstrap class loader */
   1015         clazz = dvmLookupClass(classDescriptor, NULL, false);
   1016         if (clazz != NULL) {
   1017             verifyAndOptimizeClass(pDexFile, clazz, pClassDef, doVerify, doOpt);
   1018 
   1019         } else {
   1020             // TODO: log when in verbose mode
   1021             ALOGV("DexOpt: not optimizing unavailable class '%s'",
   1022                 classDescriptor);
   1023         }
   1024     }
   1025 
   1026 #ifdef VERIFIER_STATS
   1027     ALOGI("Verifier stats:");
   1028     ALOGI(" methods examined        : %u", gDvm.verifierStats.methodsExamined);
   1029     ALOGI(" monitor-enter methods   : %u", gDvm.verifierStats.monEnterMethods);
   1030     ALOGI(" instructions examined   : %u", gDvm.verifierStats.instrsExamined);
   1031     ALOGI(" instructions re-examined: %u", gDvm.verifierStats.instrsReexamined);
   1032     ALOGI(" copying of register sets: %u", gDvm.verifierStats.copyRegCount);
   1033     ALOGI(" merging of register sets: %u", gDvm.verifierStats.mergeRegCount);
   1034     ALOGI(" ...that caused changes  : %u", gDvm.verifierStats.mergeRegChanged);
   1035     ALOGI(" uninit searches         : %u", gDvm.verifierStats.uninitSearches);
   1036     ALOGI(" max memory required     : %u", gDvm.verifierStats.biggestAlloc);
   1037 #endif
   1038 }
   1039 
   1040 /*
   1041  * Verify and/or optimize a specific class.
   1042  */
   1043 static void verifyAndOptimizeClass(DexFile* pDexFile, ClassObject* clazz,
   1044     const DexClassDef* pClassDef, bool doVerify, bool doOpt)
   1045 {
   1046     const char* classDescriptor;
   1047     bool verified = false;
   1048 
   1049     if (clazz->pDvmDex->pDexFile != pDexFile) {
   1050         /*
   1051          * The current DEX file defined a class that is also present in the
   1052          * bootstrap class path.  The class loader favored the bootstrap
   1053          * version, which means that we have a pointer to a class that is
   1054          * (a) not the one we want to examine, and (b) mapped read-only,
   1055          * so we will seg fault if we try to rewrite instructions inside it.
   1056          */
   1057         ALOGD("DexOpt: not verifying/optimizing '%s': multiple definitions",
   1058             clazz->descriptor);
   1059         return;
   1060     }
   1061 
   1062     classDescriptor = dexStringByTypeIdx(pDexFile, pClassDef->classIdx);
   1063 
   1064     /*
   1065      * First, try to verify it.
   1066      */
   1067     if (doVerify) {
   1068         if (dvmVerifyClass(clazz)) {
   1069             /*
   1070              * Set the "is preverified" flag in the DexClassDef.  We
   1071              * do it here, rather than in the ClassObject structure,
   1072              * because the DexClassDef is part of the odex file.
   1073              */
   1074             assert((clazz->accessFlags & JAVA_FLAGS_MASK) ==
   1075                 pClassDef->accessFlags);
   1076             ((DexClassDef*)pClassDef)->accessFlags |= CLASS_ISPREVERIFIED;
   1077             verified = true;
   1078         } else {
   1079             // TODO: log when in verbose mode
   1080             ALOGV("DexOpt: '%s' failed verification", classDescriptor);
   1081         }
   1082     }
   1083 
   1084     if (doOpt) {
   1085         bool needVerify = (gDvm.dexOptMode == OPTIMIZE_MODE_VERIFIED ||
   1086                            gDvm.dexOptMode == OPTIMIZE_MODE_FULL);
   1087         if (!verified && needVerify) {
   1088             ALOGV("DexOpt: not optimizing '%s': not verified",
   1089                 classDescriptor);
   1090         } else {
   1091             dvmOptimizeClass(clazz, false);
   1092 
   1093             /* set the flag whether or not we actually changed anything */
   1094             ((DexClassDef*)pClassDef)->accessFlags |= CLASS_ISOPTIMIZED;
   1095         }
   1096     }
   1097 }
   1098 
   1099 
   1100 /*
   1101  * Get the cache file name from a ClassPathEntry.
   1102  */
   1103 static const char* getCacheFileName(const ClassPathEntry* cpe)
   1104 {
   1105     switch (cpe->kind) {
   1106     case kCpeJar:
   1107         return dvmGetJarFileCacheFileName((JarFile*) cpe->ptr);
   1108     case kCpeDex:
   1109         return dvmGetRawDexFileCacheFileName((RawDexFile*) cpe->ptr);
   1110     default:
   1111         ALOGE("DexOpt: unexpected cpe kind %d", cpe->kind);
   1112         dvmAbort();
   1113         return NULL;
   1114     }
   1115 }
   1116 
   1117 /*
   1118  * Get the SHA-1 signature.
   1119  */
   1120 static const u1* getSignature(const ClassPathEntry* cpe)
   1121 {
   1122     DvmDex* pDvmDex;
   1123 
   1124     switch (cpe->kind) {
   1125     case kCpeJar:
   1126         pDvmDex = dvmGetJarFileDex((JarFile*) cpe->ptr);
   1127         break;
   1128     case kCpeDex:
   1129         pDvmDex = dvmGetRawDexFileDex((RawDexFile*) cpe->ptr);
   1130         break;
   1131     default:
   1132         ALOGE("unexpected cpe kind %d", cpe->kind);
   1133         dvmAbort();
   1134         pDvmDex = NULL;         // make gcc happy
   1135     }
   1136 
   1137     assert(pDvmDex != NULL);
   1138     return pDvmDex->pDexFile->pHeader->signature;
   1139 }
   1140 
   1141 
   1142 /*
   1143  * Dependency layout:
   1144  *  4b  Source file modification time, in seconds since 1970 UTC
   1145  *  4b  CRC-32 from Zip entry, or Adler32 from source DEX header
   1146  *  4b  Dalvik VM build number
   1147  *  4b  Number of dependency entries that follow
   1148  *  Dependency entries:
   1149  *    4b  Name length (including terminating null)
   1150  *    var Full path of cache entry (null terminated)
   1151  *    20b SHA-1 signature from source DEX file
   1152  *
   1153  * If this changes, update DEX_OPT_MAGIC_VERS.
   1154  */
   1155 static const size_t kMinDepSize = 4 * 4;
   1156 static const size_t kMaxDepSize = 4 * 4 + 2048;     // sanity check
   1157 
   1158 /*
   1159  * Read the "opt" header, verify it, then read the dependencies section
   1160  * and verify that data as well.
   1161  *
   1162  * If "sourceAvail" is "true", this will verify that "modWhen" and "crc"
   1163  * match up with what is stored in the header.  If they don't, we reject
   1164  * the file so that it can be recreated from the updated original.  If
   1165  * "sourceAvail" isn't set, e.g. for a .odex file, we ignore these arguments.
   1166  *
   1167  * On successful return, the file will be seeked immediately past the
   1168  * "opt" header.
   1169  */
   1170 bool dvmCheckOptHeaderAndDependencies(int fd, bool sourceAvail, u4 modWhen,
   1171     u4 crc, bool expectVerify, bool expectOpt)
   1172 {
   1173     DexOptHeader optHdr;
   1174     u1* depData = NULL;
   1175     const u1* magic;
   1176     off_t posn;
   1177     int result = false;
   1178     ssize_t actual;
   1179 
   1180     /*
   1181      * Start at the start.  The "opt" header, when present, will always be
   1182      * the first thing in the file.
   1183      */
   1184     if (lseek(fd, 0, SEEK_SET) != 0) {
   1185         ALOGE("DexOpt: failed to seek to start of file: %s", strerror(errno));
   1186         goto bail;
   1187     }
   1188 
   1189     /*
   1190      * Read and do trivial verification on the opt header.  The header is
   1191      * always in host byte order.
   1192      */
   1193     actual = read(fd, &optHdr, sizeof(optHdr));
   1194     if (actual < 0) {
   1195         ALOGE("DexOpt: failed reading opt header: %s", strerror(errno));
   1196         goto bail;
   1197     } else if (actual != sizeof(optHdr)) {
   1198         ALOGE("DexOpt: failed reading opt header (got %d of %zd)",
   1199             (int) actual, sizeof(optHdr));
   1200         goto bail;
   1201     }
   1202 
   1203     magic = optHdr.magic;
   1204     if (memcmp(magic, DEX_MAGIC, 4) == 0) {
   1205         /* somebody probably pointed us at the wrong file */
   1206         ALOGD("DexOpt: expected optimized DEX, found unoptimized");
   1207         goto bail;
   1208     } else if (memcmp(magic, DEX_OPT_MAGIC, 4) != 0) {
   1209         /* not a DEX file, or previous attempt was interrupted */
   1210         ALOGD("DexOpt: incorrect opt magic number (0x%02x %02x %02x %02x)",
   1211             magic[0], magic[1], magic[2], magic[3]);
   1212         goto bail;
   1213     }
   1214     if (memcmp(magic+4, DEX_OPT_MAGIC_VERS, 4) != 0) {
   1215         ALOGW("DexOpt: stale opt version (0x%02x %02x %02x %02x)",
   1216             magic[4], magic[5], magic[6], magic[7]);
   1217         goto bail;
   1218     }
   1219     if (optHdr.depsLength < kMinDepSize || optHdr.depsLength > kMaxDepSize) {
   1220         ALOGW("DexOpt: weird deps length %d, bailing", optHdr.depsLength);
   1221         goto bail;
   1222     }
   1223 
   1224     /*
   1225      * Do the header flags match up with what we want?
   1226      *
   1227      * The only thing we really can't handle is incorrect byte ordering.
   1228      */
   1229     {
   1230         const u4 matchMask = DEX_OPT_FLAG_BIG;
   1231         u4 expectedFlags = 0;
   1232 #if __BYTE_ORDER != __LITTLE_ENDIAN
   1233         expectedFlags |= DEX_OPT_FLAG_BIG;
   1234 #endif
   1235         if ((expectedFlags & matchMask) != (optHdr.flags & matchMask)) {
   1236             ALOGI("DexOpt: header flag mismatch (0x%02x vs 0x%02x, mask=0x%02x)",
   1237                 expectedFlags, optHdr.flags, matchMask);
   1238             goto bail;
   1239         }
   1240     }
   1241 
   1242     posn = lseek(fd, optHdr.depsOffset, SEEK_SET);
   1243     if (posn < 0) {
   1244         ALOGW("DexOpt: seek to deps failed: %s", strerror(errno));
   1245         goto bail;
   1246     }
   1247 
   1248     /*
   1249      * Read all of the dependency stuff into memory.
   1250      */
   1251     depData = (u1*) malloc(optHdr.depsLength);
   1252     if (depData == NULL) {
   1253         ALOGW("DexOpt: unable to allocate %d bytes for deps",
   1254             optHdr.depsLength);
   1255         goto bail;
   1256     }
   1257     actual = read(fd, depData, optHdr.depsLength);
   1258     if (actual < 0) {
   1259         ALOGW("DexOpt: failed reading deps: %s", strerror(errno));
   1260         goto bail;
   1261     } else if (actual != (ssize_t) optHdr.depsLength) {
   1262         ALOGW("DexOpt: failed reading deps: got %d of %d",
   1263             (int) actual, optHdr.depsLength);
   1264         goto bail;
   1265     }
   1266 
   1267     /*
   1268      * Verify simple items.
   1269      */
   1270     const u1* ptr;
   1271     u4 val;
   1272 
   1273     ptr = depData;
   1274     val = read4LE(&ptr);
   1275     if (sourceAvail && val != modWhen) {
   1276         ALOGI("DexOpt: source file mod time mismatch (%08x vs %08x)",
   1277             val, modWhen);
   1278         goto bail;
   1279     }
   1280     val = read4LE(&ptr);
   1281     if (sourceAvail && val != crc) {
   1282         ALOGI("DexOpt: source file CRC mismatch (%08x vs %08x)", val, crc);
   1283         goto bail;
   1284     }
   1285     val = read4LE(&ptr);
   1286     if (val != DALVIK_VM_BUILD) {
   1287         ALOGD("DexOpt: VM build version mismatch (%d vs %d)",
   1288             val, DALVIK_VM_BUILD);
   1289         goto bail;
   1290     }
   1291 
   1292     /*
   1293      * Verify dependencies on other cached DEX files.  It must match
   1294      * exactly with what is currently defined in the bootclasspath.
   1295      */
   1296     ClassPathEntry* cpe;
   1297     u4 numDeps;
   1298 
   1299     numDeps = read4LE(&ptr);
   1300     ALOGV("+++ DexOpt: numDeps = %d", numDeps);
   1301     for (cpe = gDvm.bootClassPath; cpe->ptr != NULL; cpe++) {
   1302         const char* cacheFileName =
   1303             dvmPathToAbsolutePortion(getCacheFileName(cpe));
   1304         assert(cacheFileName != NULL); /* guaranteed by Class.c */
   1305 
   1306         const u1* signature = getSignature(cpe);
   1307         size_t len = strlen(cacheFileName) +1;
   1308         u4 storedStrLen;
   1309 
   1310         if (numDeps == 0) {
   1311             /* more entries in bootclasspath than in deps list */
   1312             ALOGI("DexOpt: not all deps represented");
   1313             goto bail;
   1314         }
   1315 
   1316         storedStrLen = read4LE(&ptr);
   1317         if (len != storedStrLen ||
   1318             strcmp(cacheFileName, (const char*) ptr) != 0)
   1319         {
   1320             ALOGI("DexOpt: mismatch dep name: '%s' vs. '%s'",
   1321                 cacheFileName, ptr);
   1322             goto bail;
   1323         }
   1324 
   1325         ptr += storedStrLen;
   1326 
   1327         if (memcmp(signature, ptr, kSHA1DigestLen) != 0) {
   1328             ALOGI("DexOpt: mismatch dep signature for '%s'", cacheFileName);
   1329             goto bail;
   1330         }
   1331         ptr += kSHA1DigestLen;
   1332 
   1333         ALOGV("DexOpt: dep match on '%s'", cacheFileName);
   1334 
   1335         numDeps--;
   1336     }
   1337 
   1338     if (numDeps != 0) {
   1339         /* more entries in deps list than in classpath */
   1340         ALOGI("DexOpt: Some deps went away");
   1341         goto bail;
   1342     }
   1343 
   1344     // consumed all data and no more?
   1345     if (ptr != depData + optHdr.depsLength) {
   1346         ALOGW("DexOpt: Spurious dep data? %d vs %d",
   1347             (int) (ptr - depData), optHdr.depsLength);
   1348         assert(false);
   1349     }
   1350 
   1351     result = true;
   1352 
   1353 bail:
   1354     free(depData);
   1355     return result;
   1356 }
   1357 
   1358 /*
   1359  * Write the dependency info to "fd" at the current file position.
   1360  */
   1361 static int writeDependencies(int fd, u4 modWhen, u4 crc)
   1362 {
   1363     u1* buf = NULL;
   1364     int result = -1;
   1365     ssize_t bufLen;
   1366     ClassPathEntry* cpe;
   1367     int numDeps;
   1368 
   1369     /*
   1370      * Count up the number of completed entries in the bootclasspath.
   1371      */
   1372     numDeps = 0;
   1373     bufLen = 0;
   1374     for (cpe = gDvm.bootClassPath; cpe->ptr != NULL; cpe++) {
   1375         const char* cacheFileName =
   1376             dvmPathToAbsolutePortion(getCacheFileName(cpe));
   1377         assert(cacheFileName != NULL); /* guaranteed by Class.c */
   1378 
   1379         ALOGV("+++ DexOpt: found dep '%s'", cacheFileName);
   1380 
   1381         numDeps++;
   1382         bufLen += strlen(cacheFileName) +1;
   1383     }
   1384 
   1385     bufLen += 4*4 + numDeps * (4+kSHA1DigestLen);
   1386 
   1387     buf = (u1*)malloc(bufLen);
   1388 
   1389     set4LE(buf+0, modWhen);
   1390     set4LE(buf+4, crc);
   1391     set4LE(buf+8, DALVIK_VM_BUILD);
   1392     set4LE(buf+12, numDeps);
   1393 
   1394     // TODO: do we want to add dvmGetInlineOpsTableLength() here?  Won't
   1395     // help us if somebody replaces an existing entry, but it'd catch
   1396     // additions/removals.
   1397 
   1398     u1* ptr = buf + 4*4;
   1399     for (cpe = gDvm.bootClassPath; cpe->ptr != NULL; cpe++) {
   1400         const char* cacheFileName =
   1401             dvmPathToAbsolutePortion(getCacheFileName(cpe));
   1402         assert(cacheFileName != NULL); /* guaranteed by Class.c */
   1403 
   1404         const u1* signature = getSignature(cpe);
   1405         int len = strlen(cacheFileName) +1;
   1406 
   1407         if (ptr + 4 + len + kSHA1DigestLen > buf + bufLen) {
   1408             ALOGE("DexOpt: overran buffer");
   1409             dvmAbort();
   1410         }
   1411 
   1412         set4LE(ptr, len);
   1413         ptr += 4;
   1414         memcpy(ptr, cacheFileName, len);
   1415         ptr += len;
   1416         memcpy(ptr, signature, kSHA1DigestLen);
   1417         ptr += kSHA1DigestLen;
   1418     }
   1419 
   1420     assert(ptr == buf + bufLen);
   1421 
   1422     result = sysWriteFully(fd, buf, bufLen, "DexOpt dep info");
   1423 
   1424     free(buf);
   1425     return result;
   1426 }
   1427 
   1428 
   1429 /*
   1430  * Write a block of data in "chunk" format.
   1431  *
   1432  * The chunk header fields are always in "native" byte order.  If "size"
   1433  * is not a multiple of 8 bytes, the data area is padded out.
   1434  */
   1435 static bool writeChunk(int fd, u4 type, const void* data, size_t size)
   1436 {
   1437     union {             /* save a syscall by grouping these together */
   1438         char raw[8];
   1439         struct {
   1440             u4 type;
   1441             u4 size;
   1442         } ts;
   1443     } header;
   1444 
   1445     assert(sizeof(header) == 8);
   1446 
   1447     ALOGV("Writing chunk, type=%.4s size=%d", (char*) &type, size);
   1448 
   1449     header.ts.type = type;
   1450     header.ts.size = (u4) size;
   1451     if (sysWriteFully(fd, &header, sizeof(header),
   1452             "DexOpt opt chunk header write") != 0)
   1453     {
   1454         return false;
   1455     }
   1456 
   1457     if (size > 0) {
   1458         if (sysWriteFully(fd, data, size, "DexOpt opt chunk write") != 0)
   1459             return false;
   1460     }
   1461 
   1462     /* if necessary, pad to 64-bit alignment */
   1463     if ((size & 7) != 0) {
   1464         int padSize = 8 - (size & 7);
   1465         ALOGV("size was %d, inserting %d pad bytes", size, padSize);
   1466         lseek(fd, padSize, SEEK_CUR);
   1467     }
   1468 
   1469     assert( ((int)lseek(fd, 0, SEEK_CUR) & 7) == 0);
   1470 
   1471     return true;
   1472 }
   1473 
   1474 /*
   1475  * Write opt data.
   1476  *
   1477  * We have different pieces, some of which may be optional.  To make the
   1478  * most effective use of space, we use a "chunk" format, with a 4-byte
   1479  * type and a 4-byte length.  We guarantee 64-bit alignment for the data,
   1480  * so it can be used directly when the file is mapped for reading.
   1481  */
   1482 static bool writeOptData(int fd, const DexClassLookup* pClassLookup,
   1483     const RegisterMapBuilder* pRegMapBuilder)
   1484 {
   1485     /* pre-computed class lookup hash table */
   1486     if (!writeChunk(fd, (u4) kDexChunkClassLookup,
   1487             pClassLookup, pClassLookup->size))
   1488     {
   1489         return false;
   1490     }
   1491 
   1492     /* register maps (optional) */
   1493     if (pRegMapBuilder != NULL) {
   1494         if (!writeChunk(fd, (u4) kDexChunkRegisterMaps,
   1495                 pRegMapBuilder->data, pRegMapBuilder->size))
   1496         {
   1497             return false;
   1498         }
   1499     }
   1500 
   1501     /* write the end marker */
   1502     if (!writeChunk(fd, (u4) kDexChunkEnd, NULL, 0)) {
   1503         return false;
   1504     }
   1505 
   1506     return true;
   1507 }
   1508 
   1509 /*
   1510  * Compute a checksum on a piece of an open file.
   1511  *
   1512  * File will be positioned at end of checksummed area.
   1513  *
   1514  * Returns "true" on success.
   1515  */
   1516 static bool computeFileChecksum(int fd, off_t start, size_t length, u4* pSum)
   1517 {
   1518     unsigned char readBuf[8192];
   1519     ssize_t actual;
   1520     uLong adler;
   1521 
   1522     if (lseek(fd, start, SEEK_SET) != start) {
   1523         ALOGE("Unable to seek to start of checksum area (%ld): %s",
   1524             (long) start, strerror(errno));
   1525         return false;
   1526     }
   1527 
   1528     adler = adler32(0L, Z_NULL, 0);
   1529 
   1530     while (length != 0) {
   1531         size_t wanted = (length < sizeof(readBuf)) ? length : sizeof(readBuf);
   1532         actual = read(fd, readBuf, wanted);
   1533         if (actual <= 0) {
   1534             ALOGE("Read failed (%d) while computing checksum (len=%zu): %s",
   1535                 (int) actual, length, strerror(errno));
   1536             return false;
   1537         }
   1538 
   1539         adler = adler32(adler, readBuf, actual);
   1540 
   1541         length -= actual;
   1542     }
   1543 
   1544     *pSum = adler;
   1545     return true;
   1546 }
   1547 
   1548 /*
   1549  * Update the Adler-32 checksum stored in the DEX file.  This covers the
   1550  * swapped and optimized DEX data, but does not include the opt header
   1551  * or optimized data.
   1552  */
   1553 static void updateChecksum(u1* addr, int len, DexHeader* pHeader)
   1554 {
   1555     /*
   1556      * Rewrite the checksum.  We leave the SHA-1 signature alone.
   1557      */
   1558     uLong adler = adler32(0L, Z_NULL, 0);
   1559     const int nonSum = sizeof(pHeader->magic) + sizeof(pHeader->checksum);
   1560 
   1561     adler = adler32(adler, addr + nonSum, len - nonSum);
   1562     pHeader->checksum = adler;
   1563 }
   1564