Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(60)

Side by Side Diff: android/linker/modern_linker_jni.cc

Issue 2045303002: Update to Chromium //base at Chromium commit 3e81715e6d3a4324362635aea46ce1f1a163cca1. (Closed) Base URL: https://chromium.googlesource.com/external/github.com/domokit/base@master
Patch Set: Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « android/linker/BUILD.gn ('k') | android/record_histogram.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // This is the version of the Android-specific Chromium linker that uses 5 // This is the version of the Android-specific Chromium linker that uses
6 // the Android M and later system linker to load libraries. 6 // the Android M and later system linker to load libraries.
7 7
8 // This source code *cannot* depend on anything from base/ or the C++ 8 // This source code *cannot* depend on anything from base/ or the C++
9 // STL, to keep the final library small, and avoid ugly dependency issues. 9 // STL, to keep the final library small, and avoid ugly dependency issues.
10 10
(...skipping 26 matching lines...) Expand all
37 // 37 //
38 // The returned string is used to construct the path to libchrome.so when 38 // The returned string is used to construct the path to libchrome.so when
39 // loading directly from APK. 39 // loading directly from APK.
40 // 40 //
41 // |env| is the current JNI environment handle. 41 // |env| is the current JNI environment handle.
42 // |clazz| is the static class handle for org.chromium.base.Linker, 42 // |clazz| is the static class handle for org.chromium.base.Linker,
43 // and is ignored here. 43 // and is ignored here.
44 // Returns the CPU ABI string for which the linker is running. 44 // Returns the CPU ABI string for which the linker is running.
45 jstring GetCpuAbi(JNIEnv* env, jclass clazz) { 45 jstring GetCpuAbi(JNIEnv* env, jclass clazz) {
46 #if defined(__arm__) && defined(__ARM_ARCH_7A__) 46 #if defined(__arm__) && defined(__ARM_ARCH_7A__)
47 static const char* kCurrentABI = "armeabi-v7a"; 47 static const char* kCurrentAbi = "armeabi-v7a";
48 #elif defined(__arm__) 48 #elif defined(__arm__)
49 static const char* kCurrentABI = "armeabi"; 49 static const char* kCurrentAbi = "armeabi";
50 #elif defined(__i386__) 50 #elif defined(__i386__)
51 static const char* kCurrentABI = "x86"; 51 static const char* kCurrentAbi = "x86";
52 #elif defined(__mips__) 52 #elif defined(__mips__)
53 static const char* kCurrentABI = "mips"; 53 static const char* kCurrentAbi = "mips";
54 #elif defined(__x86_64__) 54 #elif defined(__x86_64__)
55 static const char* kCurrentABI = "x86_64"; 55 static const char* kCurrentAbi = "x86_64";
56 #elif defined(__aarch64__) 56 #elif defined(__aarch64__)
57 static const char* kCurrentABI = "arm64-v8a"; 57 static const char* kCurrentAbi = "arm64-v8a";
58 #else 58 #else
59 #error "Unsupported target abi" 59 #error "Unsupported target abi"
60 #endif 60 #endif
61 return env->NewStringUTF(kCurrentABI); 61 return env->NewStringUTF(kCurrentAbi);
62 } 62 }
63 63
64 // Convenience wrapper around dlsym() on the main executable. Returns 64 // Convenience wrapper around dlsym() on the main executable. Returns
65 // the address of the requested symbol, or nullptr if not found. Status 65 // the address of the requested symbol, or nullptr if not found. Status
66 // is available from dlerror(). 66 // is available from dlerror().
67 void* Dlsym(const char* symbol_name) { 67 void* Dlsym(const char* symbol_name) {
68 static void* handle = nullptr; 68 static void* handle = nullptr;
69 69
70 if (!handle) 70 if (!handle)
71 handle = dlopen(nullptr, RTLD_NOW); 71 handle = dlopen(nullptr, RTLD_NOW);
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
134 if (!function_ptr) { 134 if (!function_ptr) {
135 LOG_ERROR("dlsym: android_dlopen_ext: %s", dlerror()); 135 LOG_ERROR("dlsym: android_dlopen_ext: %s", dlerror());
136 return false; 136 return false;
137 } 137 }
138 } 138 }
139 139
140 const android_dlextinfo* extinfo = &dlextinfo->extinfo; 140 const android_dlextinfo* extinfo = &dlextinfo->extinfo;
141 LOG_INFO( 141 LOG_INFO(
142 "android_dlopen_ext:" 142 "android_dlopen_ext:"
143 " flags=0x%llx, reserved_addr=%p, reserved_size=%d, relro_fd=%d", 143 " flags=0x%llx, reserved_addr=%p, reserved_size=%d, relro_fd=%d",
144 extinfo->flags, extinfo->reserved_addr, extinfo->reserved_size, 144 static_cast<long long>(extinfo->flags), extinfo->reserved_addr,
145 extinfo->relro_fd); 145 static_cast<int>(extinfo->reserved_size), extinfo->relro_fd);
146 146
147 *status = (*function_ptr)(filename, flag, extinfo); 147 *status = (*function_ptr)(filename, flag, extinfo);
148 return true; 148 return true;
149 } 149 }
150 150
151 // Callback data for FindLoadedLibrarySize(). 151 // Callback data for FindLoadedLibrarySize().
152 struct CallbackData { 152 struct CallbackData {
153 explicit CallbackData(void* address) : load_address(address), load_size(0) {} 153 explicit CallbackData(void* address) : load_address(address), load_size(0) {}
154 154
155 const void* load_address; 155 const void* load_address;
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
230 if (addr < reinterpret_cast<void*>(kBreakpadGuardRegionBytes)) { 230 if (addr < reinterpret_cast<void*>(kBreakpadGuardRegionBytes)) {
231 LOG_ERROR("Fixed address %p is too low to accommodate Breakpad guard", 231 LOG_ERROR("Fixed address %p is too low to accommodate Breakpad guard",
232 addr); 232 addr);
233 addr_ = MAP_FAILED; 233 addr_ = MAP_FAILED;
234 size_ = 0; 234 size_ = 0;
235 return; 235 return;
236 } 236 }
237 addr = reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(addr) - 237 addr = reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(addr) -
238 kBreakpadGuardRegionBytes); 238 kBreakpadGuardRegionBytes);
239 } 239 }
240 LOG_INFO("Added %d to size, for Breakpad guard", kBreakpadGuardRegionBytes); 240 LOG_INFO("Added %d to size, for Breakpad guard",
241 static_cast<int>(kBreakpadGuardRegionBytes));
241 #endif 242 #endif
242 243
243 addr_ = mmap(addr, size, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); 244 addr_ = mmap(addr, size, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
244 if (addr_ != MAP_FAILED) { 245 if (addr_ != MAP_FAILED) {
245 size_ = size; 246 size_ = size;
246 } else { 247 } else {
247 LOG_INFO("mmap failed: %s", strerror(errno)); 248 LOG_INFO("mmap failed: %s", strerror(errno));
248 size_ = 0; 249 size_ = 0;
249 } 250 }
250 effective_addr_ = addr_; 251 effective_addr_ = addr_;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
285 *load_size = callback_data.load_size; 286 *load_size = callback_data.load_size;
286 return true; 287 return true;
287 } 288 }
288 289
289 // Helper for LoadLibrary(). We reserve an address space larger than 290 // Helper for LoadLibrary(). We reserve an address space larger than
290 // needed. After library loading we want to trim that reservation to only 291 // needed. After library loading we want to trim that reservation to only
291 // what is needed. 292 // what is needed.
292 bool ResizeReservedAddressSpace(void* addr, 293 bool ResizeReservedAddressSpace(void* addr,
293 size_t reserved_size, 294 size_t reserved_size,
294 size_t load_size) { 295 size_t load_size) {
295 LOG_INFO("Called for %p, reserved %d, loaded %d", addr, reserved_size, 296 LOG_INFO("Called for %p, reserved %d, loaded %d", addr,
296 load_size); 297 static_cast<int>(reserved_size), static_cast<int>(load_size));
297 298
298 if (reserved_size < load_size) { 299 if (reserved_size < load_size) {
299 LOG_ERROR("WARNING: library reservation was too small"); 300 LOG_ERROR("WARNING: library reservation was too small");
300 return true; 301 return true;
301 } 302 }
302 303
303 // Unmap the part of the reserved address space that is beyond the end of 304 // Unmap the part of the reserved address space that is beyond the end of
304 // the loaded library data. 305 // the loaded library data.
305 void* unmap = 306 void* unmap =
306 reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(addr) + load_size); 307 reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(addr) + load_size);
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after
586 env->RegisterNatives(linker_class, kNativeMethods, 587 env->RegisterNatives(linker_class, kNativeMethods,
587 sizeof(kNativeMethods) / sizeof(kNativeMethods[0])); 588 sizeof(kNativeMethods) / sizeof(kNativeMethods[0]));
588 589
589 // Record the Java VM handle. 590 // Record the Java VM handle.
590 s_java_vm = vm; 591 s_java_vm = vm;
591 592
592 return true; 593 return true;
593 } 594 }
594 595
595 } // namespace chromium_android_linker 596 } // namespace chromium_android_linker
OLDNEW
« no previous file with comments | « android/linker/BUILD.gn ('k') | android/record_histogram.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698