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..8f81b6a21e8eb6ed98dc3f9a97a77c8b7f703b6b 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 |
@@ -21,7 +21,8 @@ import org.chromium.base.JNINamespace; |
import org.chromium.content.browser.ChildProcessConnection; |
import org.chromium.content.common.IChildProcessCallback; |
import org.chromium.content.common.IChildProcessService; |
-import org.chromium.content.browser.ChildProcessLauncher; |
+import org.chromium.content.common.Linker; |
+import org.chromium.content.common.LinkerParams; |
import org.chromium.content.common.ProcessInitException; |
import java.util.ArrayList; |
@@ -52,9 +53,13 @@ public class ChildProcessService extends Service { |
// Pairs IDs and file descriptors that should be registered natively. |
private ArrayList<Integer> mFileIds; |
private ArrayList<ParcelFileDescriptor> mFileFds; |
+ // Linker-specific parameters for this child process service. |
+ private LinkerParams mLinkerParams; |
private static AtomicReference<Context> sContext = new AtomicReference<Context>(null); |
private boolean mLibraryInitialized = false; |
+ // Becomes true once the service is bound. |
+ private boolean mIsBound = false; |
// Binder object used by clients for this service. |
private final IChildProcessService.Stub mBinder = new IChildProcessService.Stub() { |
@@ -89,6 +94,11 @@ public class ChildProcessService extends Service { |
+ ChildProcessConnection.EXTRA_FILES_ID_SUFFIX; |
mFileIds.add(args.getInt(idName)); |
} |
+ Bundle sharedRelros = args.getBundle(Linker.EXTRA_LINKER_SHARED_RELROS); |
+ if (sharedRelros != null) { |
+ Linker.useSharedRelros(sharedRelros); |
+ sharedRelros = null; |
+ } |
mMainThread.notifyAll(); |
} |
return Process.myPid(); |
@@ -112,6 +122,18 @@ public class ChildProcessService extends Service { |
@Override |
public void run() { |
try { |
+ boolean useLinker = Linker.isUsed(); |
+ |
+ if (useLinker) { |
+ synchronized (mMainThread) { |
+ while (!mIsBound) |
+ mMainThread.wait(); |
+ } |
+ if (mLinkerParams != null && mLinkerParams.mWaitForSharedRelro) |
+ Linker.wantSharedRelros(mLinkerParams.mBaseLoadAddress); |
+ else |
+ Linker.disableSharedRelros(); |
+ } |
try { |
LibraryLoader.loadNow(); |
} catch (ProcessInitException e) { |
@@ -188,6 +210,10 @@ public class ChildProcessService extends Service { |
synchronized (mMainThread) { |
mCommandLineParams = intent.getStringArrayExtra( |
ChildProcessConnection.EXTRA_COMMAND_LINE); |
+ mLinkerParams = null; |
+ if (Linker.isUsed()) |
+ mLinkerParams = new LinkerParams(intent); |
+ mIsBound = true; |
mMainThread.notifyAll(); |
} |