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 3d85310926cb657db415002f0e5e2b7bc5eb8090..be2a1956feacf8b22ebb103b701bfafc99fadf3b 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 |
@@ -18,6 +18,7 @@ import android.view.Surface; |
import org.chromium.base.CalledByNative; |
import org.chromium.base.JNINamespace; |
+import org.chromium.base.Linker; |
import org.chromium.content.browser.ChildProcessConnection; |
import org.chromium.content.common.IChildProcessCallback; |
import org.chromium.content.common.IChildProcessService; |
@@ -52,6 +53,8 @@ public class ChildProcessService extends Service { |
// Pairs IDs and file descriptors that should be registered natively. |
private ArrayList<Integer> mFileIds; |
private ArrayList<ParcelFileDescriptor> mFileFds; |
+ private long mLinkerLoadAddress; |
+ private Bundle mLinkerSharedRelroBundle; |
private static AtomicReference<Context> sContext = new AtomicReference<Context>(null); |
private boolean mLibraryInitialized = false; |
@@ -93,6 +96,14 @@ public class ChildProcessService extends Service { |
} |
return Process.myPid(); |
} |
+ |
+ @Override |
+ public void applyRelro(Bundle relroBundle) { |
+ synchronized (mMainThread) { |
+ mLinkerSharedRelroBundle = relroBundle; |
+ mMainThread.notifyAll(); |
+ } |
+ } |
}; |
/* package */ static Context getContext() { |
@@ -112,15 +123,38 @@ public class ChildProcessService extends Service { |
@Override |
public void run() { |
try { |
+ if (LibraryLoader.useCrazyLinker()) { |
+ // Wait for bind() to load mLinkerLoadAddress. |
+ synchronized (mMainThread) { |
+ while (mCommandLineParams == null) { |
+ mMainThread.wait(); |
+ } |
+ } |
+ Linker.setBaseLoadAddress(mLinkerLoadAddress); |
+ if (mLinkerLoadAddress != 0) { |
+ // If a shared RELRO section is being used, delay |
+ // loading the library until the corresponding information |
+ // is received. |
+ synchronized (mMainThread) { |
+ while (mLinkerSharedRelroBundle == null) { |
+ mMainThread.wait(); |
+ } |
+ } |
+ Linker.applyRelroBundle(mLinkerSharedRelroBundle); |
+ } |
+ } |
+ |
try { |
LibraryLoader.loadNow(); |
} catch (ProcessInitException e) { |
Log.e(TAG, "Failed to load native library, exiting child process", e); |
return; |
} |
- synchronized (mMainThread) { |
- while (mCommandLineParams == null) { |
- mMainThread.wait(); |
+ if (!LibraryLoader.useCrazyLinker()) { |
+ synchronized (mMainThread) { |
+ while (mCommandLineParams == null) { |
+ mMainThread.wait(); |
+ } |
} |
} |
LibraryLoader.initialize(mCommandLineParams); |
@@ -188,6 +222,8 @@ public class ChildProcessService extends Service { |
synchronized (mMainThread) { |
mCommandLineParams = intent.getStringArrayExtra( |
ChildProcessConnection.EXTRA_COMMAND_LINE); |
+ mLinkerLoadAddress = intent.getLongExtra( |
+ ChildProcessConnection.EXTRA_CHROME_LINKER_ADDRESS, 0); |
mMainThread.notifyAll(); |
} |