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

Unified Diff: content/public/android/java/src/org/chromium/content/app/ChildProcessService.java

Issue 23717023: Android: Add chrome-specific dynamic linker. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix compile error (previous patch was a mistake). Created 7 years, 3 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 side-by-side diff with in-line comments
Download patch
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();
}

Powered by Google App Engine
This is Rietveld 408576698