diff options
Diffstat (limited to 'dexdump/dexdump.cc')
-rw-r--r-- | dexdump/dexdump.cc | 48 |
1 files changed, 43 insertions, 5 deletions
diff --git a/dexdump/dexdump.cc b/dexdump/dexdump.cc index 1518e1d205..16cb302a84 100644 --- a/dexdump/dexdump.cc +++ b/dexdump/dexdump.cc @@ -34,8 +34,13 @@ #include "dexdump.h" +#include <fcntl.h> #include <inttypes.h> #include <stdio.h> +#include <sys/mman.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> #include <iostream> #include <memory> @@ -44,7 +49,6 @@ #include "android-base/stringprintf.h" -#include "dex/art_dex_file_loader.h" #include "dex/code_item_accessors-no_art-inl.h" #include "dex/dex_file-inl.h" #include "dex/dex_file_exception_helpers.h" @@ -1868,6 +1872,34 @@ static void processDexFile(const char* fileName, } } +static bool openAndMapFile(const char* fileName, + const uint8_t** base, + size_t* size, + std::string* error_msg) { + int fd = open(fileName, O_RDONLY); + if (fd < 0) { + *error_msg = "open failed"; + return false; + } + struct stat st; + if (fstat(fd, &st) < 0) { + *error_msg = "stat failed"; + return false; + } + *size = st.st_size; + if (*size == 0) { + *error_msg = "size == 0"; + return false; + } + void* addr = mmap(nullptr /*addr*/, *size, PROT_READ, MAP_PRIVATE, fd, 0 /*offset*/); + if (addr == MAP_FAILED) { + *error_msg = "mmap failed"; + return false; + } + *base = reinterpret_cast<const uint8_t*>(addr); + return true; +} + /* * Processes a single file (either direct .dex or indirect .zip/.jar/.apk). */ @@ -1879,12 +1911,18 @@ int processFile(const char* fileName) { // If the file is not a .dex file, the function tries .zip/.jar/.apk files, // all of which are Zip archives with "classes.dex" inside. const bool kVerifyChecksum = !gOptions.ignoreBadChecksum; + const uint8_t* base = nullptr; + size_t size = 0; std::string error_msg; - // TODO: Use DexFileLoader when that is implemented. - const ArtDexFileLoader dex_file_loader; + if (!openAndMapFile(fileName, &base, &size, &error_msg)) { + fputs(error_msg.c_str(), stderr); + fputc('\n', stderr); + return -1; + } + const DexFileLoader dex_file_loader; std::vector<std::unique_ptr<const DexFile>> dex_files; - if (!dex_file_loader.Open( - fileName, fileName, /* verify */ true, kVerifyChecksum, &error_msg, &dex_files)) { + if (!dex_file_loader.OpenAll( + base, size, fileName, /*verify*/ true, kVerifyChecksum, &error_msg, &dex_files)) { // Display returned error message to user. Note that this error behavior // differs from the error messages shown by the original Dalvik dexdump. fputs(error_msg.c_str(), stderr); |