Index: base/android/java/src/org/chromium/base/library_loader/Linker.java |
diff --git a/base/android/java/src/org/chromium/base/library_loader/Linker.java b/base/android/java/src/org/chromium/base/library_loader/Linker.java |
index 997b67c4b024b189a55dc9546b71d1032e25926b..dbd780b658a6e78da87663e265fd21b49fb1a406 100644 |
--- a/base/android/java/src/org/chromium/base/library_loader/Linker.java |
+++ b/base/android/java/src/org/chromium/base/library_loader/Linker.java |
@@ -243,8 +243,8 @@ public class Linker { |
} |
if (sMemoryDeviceConfig == MEMORY_DEVICE_CONFIG_INIT) { |
- sMemoryDeviceConfig = SysUtils.isLowEndDevice() ? |
- MEMORY_DEVICE_CONFIG_LOW : MEMORY_DEVICE_CONFIG_NORMAL; |
+ sMemoryDeviceConfig = SysUtils.isLowEndDevice() |
+ ? MEMORY_DEVICE_CONFIG_LOW : MEMORY_DEVICE_CONFIG_NORMAL; |
} |
switch (BROWSER_SHARED_RELRO_CONFIG) { |
@@ -341,8 +341,8 @@ public class Linker { |
assert NativeLibraries.sEnableLinkerTests; |
synchronized (Linker.class) { |
assert sMemoryDeviceConfig == MEMORY_DEVICE_CONFIG_INIT; |
- assert memoryDeviceConfig == MEMORY_DEVICE_CONFIG_LOW || |
- memoryDeviceConfig == MEMORY_DEVICE_CONFIG_NORMAL; |
+ assert memoryDeviceConfig == MEMORY_DEVICE_CONFIG_LOW |
+ || memoryDeviceConfig == MEMORY_DEVICE_CONFIG_NORMAL; |
if (DEBUG) { |
if (memoryDeviceConfig == MEMORY_DEVICE_CONFIG_LOW) |
Log.i(TAG, "Simulating a low-memory device"); |
@@ -507,8 +507,8 @@ public class Linker { |
parcel.recycle(); |
} |
if (DEBUG) { |
- Log.i(TAG, "useSharedRelros() called with " + bundle + |
- ", cloned " + clonedBundle); |
+ Log.i(TAG, "useSharedRelros() called with " + bundle |
+ + ", cloned " + clonedBundle); |
} |
synchronized (Linker.class) { |
// Note that in certain cases, this can be called before |
@@ -640,8 +640,7 @@ public class Linker { |
final long maxExpectedBytes = 192 * 1024 * 1024; |
final long address = nativeGetRandomBaseLoadAddress(maxExpectedBytes); |
if (DEBUG) { |
- Log.i(TAG, |
- String.format(Locale.US, "Random native base load address: 0x%x", address)); |
+ Log.i(TAG, String.format(Locale.US, "Random native base load address: 0x%x", address)); |
} |
return address; |
} |
@@ -703,7 +702,8 @@ public class Linker { |
* Load a native shared library with the Chromium linker. |
* The shared library is uncompressed and page aligned inside the zipfile. |
* Note the crazy linker treats libraries and files as equivalent, |
- * so you can only open one library in a given zip file. |
+ * so you can only open one library in a given zip file. The library must |
+ * not be the Chromium linker library. |
* |
* @param zipfile The filename of the zipfile contain the library. |
* @param library The library's base name. |
@@ -713,7 +713,8 @@ public class Linker { |
} |
/** |
- * Load a native shared library with the Chromium linker. |
+ * Load a native shared library with the Chromium linker. The library must |
+ * not be the Chromium linker library. |
* |
* @param library The library's base name. |
*/ |
@@ -724,15 +725,7 @@ public class Linker { |
private static void loadLibraryMaybeInZipFile( |
@Nullable String zipFile, String library) { |
if (DEBUG) Log.i(TAG, "loadLibrary: " + library); |
- |
- // Don't self-load the linker. This is because the build system is |
- // not clever enough to understand that all the libraries packaged |
- // in the final .apk don't need to be explicitly loaded. |
- // Also deal with the component build that adds a .cr suffix to the name. |
- if (library.equals(TAG) || library.equals(TAG + ".cr")) { |
- if (DEBUG) Log.i(TAG, "ignoring self-linker load"); |
- return; |
- } |
+ assert !isChromiumLinkerLibrary(library); |
synchronized (Linker.class) { |
ensureInitializedLocked(); |
@@ -762,8 +755,8 @@ public class Linker { |
String sharedRelRoName = libName; |
if (zipFile != null) { |
if (!nativeLoadLibraryInZipFile(zipFile, libName, loadAddress, libInfo)) { |
- String errorMessage = "Unable to load library: " + libName + |
- ", in: " + zipFile; |
+ String errorMessage = "Unable to load library: " + libName |
+ + ", in: " + zipFile; |
Log.e(TAG, errorMessage); |
throw new UnsatisfiedLinkError(errorMessage); |
} |
@@ -822,6 +815,14 @@ public class Linker { |
} |
/** |
+ * Determine whether a library is the linker library. Also deal with the |
+ * component build that adds a .cr suffix to the name. |
+ */ |
+ public static boolean isChromiumLinkerLibrary(String library) { |
+ return library.equals(TAG) || library.equals(TAG + ".cr"); |
+ } |
+ |
+ /** |
* Check whether the device supports loading a library directly from the APK file. |
* |
* @param apkFile Filename of the APK. |
@@ -834,13 +835,32 @@ public class Linker { |
if (DEBUG) Log.i(TAG, "checkLibraryLoadFromApkSupported: " + apkFile); |
boolean supported = nativeCheckLibraryLoadFromApkSupport(apkFile); |
- if (DEBUG) Log.i(TAG, "Loading a library directly from the APK file " + |
- (supported ? "" : "NOT ") + "supported"); |
+ if (DEBUG) Log.i(TAG, "Loading a library directly from the APK file " |
+ + (supported ? "" : "NOT ") + "supported"); |
return supported; |
} |
} |
/** |
+ * Check whether a library is page aligned in the APK file. |
+ * |
+ * @param apkFile Filename of the APK. |
+ * @param library The library's base name. |
+ * @return true if page aligned. |
+ */ |
+ public static boolean checkLibraryAlignedInApk(String apkFile, String library) { |
+ synchronized (Linker.class) { |
+ ensureInitializedLocked(); |
+ |
+ if (DEBUG) Log.i(TAG, "checkLibraryAlignedInApk: " + apkFile + ", " + library); |
+ boolean aligned = nativeCheckLibraryAlignedInApk(apkFile, library); |
+ if (DEBUG) Log.i(TAG, library + " is " + (aligned ? "" : "NOT ") + |
+ "page aligned in " + apkFile); |
+ return aligned; |
+ } |
+ } |
+ |
+ /** |
* Move activity from the native thread to the main UI thread. |
* Called from native code on its own thread. Posts a callback from |
* the UI thread back to native code. |
@@ -885,11 +905,10 @@ public class Linker { |
* of this LibInfo instance will set on success. |
* @return true for success, false otherwise. |
*/ |
- private static native boolean nativeLoadLibraryInZipFile( |
- String zipfileName, |
- String libraryName, |
- long loadAddress, |
- LibInfo libInfo); |
+ private static native boolean nativeLoadLibraryInZipFile(String zipfileName, |
+ String libraryName, |
+ long loadAddress, |
+ LibInfo libInfo); |
/** |
* Native method used to create a shared RELRO section. |
@@ -943,11 +962,19 @@ public class Linker { |
* |
* @param apkFile Filename of the APK. |
* @return true if supported. |
- * |
*/ |
private static native boolean nativeCheckLibraryLoadFromApkSupport(String apkFile); |
/** |
+ * Native method which checks whether a library is page aligned in the APK file. |
+ * |
+ * @param apkFile Filename of the APK. |
+ * @param library The library's base name. |
+ * @return true if page aligned. |
+ */ |
+ private static native boolean nativeCheckLibraryAlignedInApk(String apkFile, String library); |
+ |
+ /** |
* Record information for a given library. |
* IMPORTANT: Native code knows about this class's fields, so |
* don't change them without modifying the corresponding C++ sources. |
@@ -1080,5 +1107,5 @@ public class Linker { |
// Used to pass the shared RELRO Bundle through Binder. |
public static final String EXTRA_LINKER_SHARED_RELROS = |
- "org.chromium.base.android.linker.shared_relros"; |
+ "org.chromium.base.android.linker.shared_relros"; |
} |