Index: content/public/android/java/src/org/chromium/content/app/ChildProcessService.java |
diff --git a/content/public/android/java/src/org/chromium/content/app/ChildProcessService.java b/content/public/android/java/src/org/chromium/content/app/ChildProcessService.java |
index 16c57028cabcb52de6c8aa95f41a51dc7baab0fb..5b2e911680be374cd2ebe306422439c3db336310 100644 |
--- a/content/public/android/java/src/org/chromium/content/app/ChildProcessService.java |
+++ b/content/public/android/java/src/org/chromium/content/app/ChildProcessService.java |
@@ -129,7 +129,7 @@ public class ChildProcessService extends Service { |
public void run() { |
try { |
boolean useLinker = Linker.isUsed(); |
- |
+ boolean requestedSharedRelro = false; |
if (useLinker) { |
synchronized (mMainThread) { |
while (!mIsBound) { |
@@ -137,18 +137,37 @@ public class ChildProcessService extends Service { |
} |
} |
if (mLinkerParams != null) { |
- if (mLinkerParams.mWaitForSharedRelro) |
+ if (mLinkerParams.mWaitForSharedRelro) { |
+ requestedSharedRelro = true; |
Linker.initServiceProcess(mLinkerParams.mBaseLoadAddress); |
- else |
+ } else { |
Linker.disableSharedRelros(); |
- |
+ } |
Linker.setTestRunnerClassName(mLinkerParams.mTestRunnerClassName); |
} |
} |
+ boolean isLoaded = false; |
try { |
LibraryLoader.loadNow(getApplicationContext(), false); |
+ isLoaded = true; |
} catch (ProcessInitException e) { |
- Log.e(TAG, "Failed to load native library, exiting child process", e); |
+ if (requestedSharedRelro) { |
+ Log.w(TAG, "Failed to load native library with shared RELRO, " + |
+ "retrying without"); |
+ } else { |
+ Log.e(TAG, "Failed to load native library", e); |
+ } |
+ } |
+ if (!isLoaded && requestedSharedRelro) { |
+ Linker.disableSharedRelros(); |
+ try { |
+ LibraryLoader.loadNow(getApplicationContext(), false); |
+ isLoaded = true; |
+ } catch (ProcessInitException e) { |
+ Log.e(TAG, "Failed to load native library on retry", e); |
+ } |
+ } |
+ if (!isLoaded) { |
System.exit(-1); |
} |
synchronized (mMainThread) { |