OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 package org.chromium.base.library_loader; | 5 package org.chromium.base.library_loader; |
6 | 6 |
7 import android.os.Bundle; | 7 import android.os.Bundle; |
8 import android.os.Parcel; | 8 import android.os.Parcel; |
9 import android.os.ParcelFileDescriptor; | 9 import android.os.ParcelFileDescriptor; |
10 import android.os.Parcelable; | 10 import android.os.Parcelable; |
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
208 | 208 |
209 // The map of all RELRO sections either created or used in this process. | 209 // The map of all RELRO sections either created or used in this process. |
210 private static Bundle sSharedRelros = null; | 210 private static Bundle sSharedRelros = null; |
211 | 211 |
212 // Current common random base load address. | 212 // Current common random base load address. |
213 private static long sBaseLoadAddress = 0; | 213 private static long sBaseLoadAddress = 0; |
214 | 214 |
215 // Current fixed-location load address for the next library called by loadLi
brary(). | 215 // Current fixed-location load address for the next library called by loadLi
brary(). |
216 private static long sCurrentLoadAddress = 0; | 216 private static long sCurrentLoadAddress = 0; |
217 | 217 |
218 // Becomes true if any library fails to load at a given, non-0, fixed addres
s. | |
219 private static boolean sLoadAtFixedAddressFailed = false; | |
220 | |
221 // Becomes true once prepareLibraryLoad() has been called. | 218 // Becomes true once prepareLibraryLoad() has been called. |
222 private static boolean sPrepareLibraryLoadCalled = false; | 219 private static boolean sPrepareLibraryLoadCalled = false; |
223 | 220 |
224 // Used internally to initialize the linker's static data. Assume lock is he
ld. | 221 // Used internally to initialize the linker's static data. Assume lock is he
ld. |
225 private static void ensureInitializedLocked() { | 222 private static void ensureInitializedLocked() { |
226 assert Thread.holdsLock(Linker.class); | 223 assert Thread.holdsLock(Linker.class); |
227 | 224 |
228 if (!sInitialized) { | 225 if (!sInitialized) { |
229 sRelroSharingSupported = false; | 226 sRelroSharingSupported = false; |
230 if (NativeLibraries.USE_LINKER) { | 227 if (NativeLibraries.USE_LINKER) { |
(...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
693 } | 690 } |
694 | 691 |
695 // In service processes, close all file descriptors from the map now. | 692 // In service processes, close all file descriptors from the map now. |
696 if (!sInBrowserProcess) | 693 if (!sInBrowserProcess) |
697 closeLibInfoMap(relroMap); | 694 closeLibInfoMap(relroMap); |
698 | 695 |
699 if (DEBUG) Log.i(TAG, "Linker.useSharedRelrosLocked() exiting"); | 696 if (DEBUG) Log.i(TAG, "Linker.useSharedRelrosLocked() exiting"); |
700 } | 697 } |
701 | 698 |
702 /** | 699 /** |
703 * Returns whether the linker was unable to load one library at a given fixe
d address. | |
704 * | |
705 * @return true if at least one library was not loaded at the expected fixed
address. | |
706 */ | |
707 public static boolean loadAtFixedAddressFailed() { | |
708 return sLoadAtFixedAddressFailed; | |
709 } | |
710 | |
711 /** | |
712 * Load a native shared library with the Chromium linker. | 700 * Load a native shared library with the Chromium linker. |
713 * The shared library is uncompressed and page aligned inside the zipfile. | 701 * The shared library is uncompressed and page aligned inside the zipfile. |
714 * Note the crazy linker treats libraries and files as equivalent, | 702 * Note the crazy linker treats libraries and files as equivalent, |
715 * so you can only open one library in a given zip file. | 703 * so you can only open one library in a given zip file. |
716 * | 704 * |
717 * @param zipfile The filename of the zipfile contain the library. | 705 * @param zipfile The filename of the zipfile contain the library. |
718 * @param library The library's base name. | 706 * @param library The library's base name. |
719 */ | 707 */ |
720 public static void loadLibraryInZipFile(String zipfile, String library) { | 708 public static void loadLibraryInZipFile(String zipfile, String library) { |
721 loadLibraryMaybeInZipFile(zipfile, library); | 709 loadLibraryMaybeInZipFile(zipfile, library); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
764 | 752 |
765 LibInfo libInfo = new LibInfo(); | 753 LibInfo libInfo = new LibInfo(); |
766 long loadAddress = 0; | 754 long loadAddress = 0; |
767 if ((sInBrowserProcess && sBrowserUsesSharedRelro) || sWaitForShared
Relros) { | 755 if ((sInBrowserProcess && sBrowserUsesSharedRelro) || sWaitForShared
Relros) { |
768 // Load the library at a fixed address. | 756 // Load the library at a fixed address. |
769 loadAddress = sCurrentLoadAddress; | 757 loadAddress = sCurrentLoadAddress; |
770 } | 758 } |
771 | 759 |
772 String sharedRelRoName = libName; | 760 String sharedRelRoName = libName; |
773 if (zipFile != null) { | 761 if (zipFile != null) { |
774 if (!nativeLoadLibraryInZipFile( | 762 if (!nativeLoadLibraryInZipFile(zipFile, libName, loadAddress, l
ibInfo)) { |
775 zipFile, libName, loadAddress, libInfo)) { | 763 String errorMessage = "Unable to load library: " + libName + |
776 String errorMessage = | 764 ", in: " + zipFile; |
777 "Unable to load library: " + libName + " in: " + | |
778 zipFile; | |
779 Log.e(TAG, errorMessage); | 765 Log.e(TAG, errorMessage); |
780 throw new UnsatisfiedLinkError(errorMessage); | 766 throw new UnsatisfiedLinkError(errorMessage); |
781 } | 767 } |
782 sharedRelRoName = zipFile; | 768 sharedRelRoName = zipFile; |
783 } else { | 769 } else { |
784 if (!nativeLoadLibrary(libName, loadAddress, libInfo)) { | 770 if (!nativeLoadLibrary(libName, loadAddress, libInfo)) { |
785 String errorMessage = "Unable to load library: " + libName; | 771 String errorMessage = "Unable to load library: " + libName; |
786 Log.e(TAG, errorMessage); | 772 Log.e(TAG, errorMessage); |
787 throw new UnsatisfiedLinkError(errorMessage); | 773 throw new UnsatisfiedLinkError(errorMessage); |
788 } | 774 } |
789 } | 775 } |
790 // Keep track whether the library has been loaded at the expected lo
ad address. | |
791 if (loadAddress != 0 && loadAddress != libInfo.mLoadAddress) | |
792 sLoadAtFixedAddressFailed = true; | |
793 | 776 |
794 // Print the load address to the logcat when testing the linker. The
format | 777 // Print the load address to the logcat when testing the linker. The
format |
795 // of the string is expected by the Python test_runner script as one
of: | 778 // of the string is expected by the Python test_runner script as one
of: |
796 // BROWSER_LIBRARY_ADDRESS: <library-name> <address> | 779 // BROWSER_LIBRARY_ADDRESS: <library-name> <address> |
797 // RENDERER_LIBRARY_ADDRESS: <library-name> <address> | 780 // RENDERER_LIBRARY_ADDRESS: <library-name> <address> |
798 // Where <library-name> is the library name, and <address> is the he
xadecimal load | 781 // Where <library-name> is the library name, and <address> is the he
xadecimal load |
799 // address. | 782 // address. |
800 if (NativeLibraries.ENABLE_LINKER_TESTS) { | 783 if (NativeLibraries.ENABLE_LINKER_TESTS) { |
801 Log.i(TAG, String.format( | 784 Log.i(TAG, String.format( |
802 Locale.US, | 785 Locale.US, |
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1061 } | 1044 } |
1062 } | 1045 } |
1063 | 1046 |
1064 // The map of libraries that are currently loaded in this process. | 1047 // The map of libraries that are currently loaded in this process. |
1065 private static HashMap<String, LibInfo> sLoadedLibraries = null; | 1048 private static HashMap<String, LibInfo> sLoadedLibraries = null; |
1066 | 1049 |
1067 // Used to pass the shared RELRO Bundle through Binder. | 1050 // Used to pass the shared RELRO Bundle through Binder. |
1068 public static final String EXTRA_LINKER_SHARED_RELROS = | 1051 public static final String EXTRA_LINKER_SHARED_RELROS = |
1069 "org.chromium.base.android.linker.shared_relros"; | 1052 "org.chromium.base.android.linker.shared_relros"; |
1070 } | 1053 } |
OLD | NEW |