diff options
Diffstat (limited to 'tools/profiler/core/shared-libraries-linux.cc')
-rw-r--r-- | tools/profiler/core/shared-libraries-linux.cc | 145 |
1 files changed, 0 insertions, 145 deletions
diff --git a/tools/profiler/core/shared-libraries-linux.cc b/tools/profiler/core/shared-libraries-linux.cc deleted file mode 100644 index 553039fb7..000000000 --- a/tools/profiler/core/shared-libraries-linux.cc +++ /dev/null @@ -1,145 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "shared-libraries.h" - -#define PATH_MAX_TOSTRING(x) #x -#define PATH_MAX_STRING(x) PATH_MAX_TOSTRING(x) -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <limits.h> -#include <unistd.h> -#include <fstream> -#include "platform.h" -#include "shared-libraries.h" - -#include "common/linux/file_id.h" -#include <algorithm> - -#define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0])) - -// Get the breakpad Id for the binary file pointed by bin_name -static std::string getId(const char *bin_name) -{ - using namespace google_breakpad; - using namespace std; - - PageAllocator allocator; - auto_wasteful_vector<uint8_t, sizeof(MDGUID)> identifier(&allocator); - - FileID file_id(bin_name); - if (file_id.ElfFileIdentifier(identifier)) { - return FileID::ConvertIdentifierToUUIDString(identifier) + "0"; - } - - return ""; -} - -// TODO fix me with proper include -#include "nsDebug.h" -#ifdef ANDROID -#include "ElfLoader.h" // dl_phdr_info -#else -#include <link.h> // dl_phdr_info -#endif -#include <features.h> -#include <dlfcn.h> -#include <sys/types.h> - -#ifdef ANDROID -extern "C" MOZ_EXPORT __attribute__((weak)) -int dl_iterate_phdr( - int (*callback) (struct dl_phdr_info *info, - size_t size, void *data), - void *data); -#endif - -static int -dl_iterate_callback(struct dl_phdr_info *dl_info, size_t size, void *data) -{ - SharedLibraryInfo& info = *reinterpret_cast<SharedLibraryInfo*>(data); - - if (dl_info->dlpi_phnum <= 0) - return 0; - - unsigned long libStart = -1; - unsigned long libEnd = 0; - - for (size_t i = 0; i < dl_info->dlpi_phnum; i++) { - if (dl_info->dlpi_phdr[i].p_type != PT_LOAD) { - continue; - } - unsigned long start = dl_info->dlpi_addr + dl_info->dlpi_phdr[i].p_vaddr; - unsigned long end = start + dl_info->dlpi_phdr[i].p_memsz; - if (start < libStart) - libStart = start; - if (end > libEnd) - libEnd = end; - } - const char *name = dl_info->dlpi_name; - SharedLibrary shlib(libStart, libEnd, 0, getId(name), name); - info.AddSharedLibrary(shlib); - - return 0; -} - -SharedLibraryInfo SharedLibraryInfo::GetInfoForSelf() -{ - SharedLibraryInfo info; - -#ifdef ANDROID - if (!dl_iterate_phdr) { - // On ARM Android, dl_iterate_phdr is provided by the custom linker. - // So if libxul was loaded by the system linker (e.g. as part of - // xpcshell when running tests), it won't be available and we should - // not call it. - return info; - } -#endif // ANDROID - - dl_iterate_phdr(dl_iterate_callback, &info); - -#if defined(ANDROID) - pid_t pid = getpid(); - char path[PATH_MAX]; - snprintf(path, PATH_MAX, "/proc/%d/maps", pid); - std::ifstream maps(path); - std::string line; - int count = 0; - while (std::getline(maps, line)) { - int ret; - //XXX: needs input sanitizing - unsigned long start; - unsigned long end; - char perm[6] = ""; - unsigned long offset; - char name[PATH_MAX] = ""; - ret = sscanf(line.c_str(), - "%lx-%lx %6s %lx %*s %*x %" PATH_MAX_STRING(PATH_MAX) "s\n", - &start, &end, perm, &offset, name); - if (!strchr(perm, 'x')) { - // Ignore non executable entries - continue; - } - if (ret != 5 && ret != 4) { - LOG("Get maps line failed"); - continue; - } - // Use proc/pid/maps to get the dalvik-jit section since it has - // no associated phdrs - if (strcmp(name, "/dev/ashmem/dalvik-jit-code-cache") != 0) - continue; - SharedLibrary shlib(start, end, offset, getId(name), name); - info.AddSharedLibrary(shlib); - if (count > 10000) { - LOG("Get maps failed"); - break; - } - count++; - } -#endif // ANDROID - - return info; -} |