1*6777b538SAndroid Build Coastguard Worker // Copyright 2011 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_NATIVE_LIBRARY_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_NATIVE_LIBRARY_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker // This file defines a cross-platform "NativeLibrary" type which represents 9*6777b538SAndroid Build Coastguard Worker // a loadable module. 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Worker #include <string> 12*6777b538SAndroid Build Coastguard Worker 13*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h" 14*6777b538SAndroid Build Coastguard Worker #include "base/files/file_path.h" 15*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr_exclusion.h" 16*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_piece.h" 17*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h" 18*6777b538SAndroid Build Coastguard Worker 19*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN) 20*6777b538SAndroid Build Coastguard Worker #include <windows.h> 21*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_APPLE) 22*6777b538SAndroid Build Coastguard Worker #import <CoreFoundation/CoreFoundation.h> 23*6777b538SAndroid Build Coastguard Worker #endif // OS_* 24*6777b538SAndroid Build Coastguard Worker 25*6777b538SAndroid Build Coastguard Worker namespace base { 26*6777b538SAndroid Build Coastguard Worker 27*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN) 28*6777b538SAndroid Build Coastguard Worker using NativeLibrary = HMODULE; 29*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_APPLE) 30*6777b538SAndroid Build Coastguard Worker enum NativeLibraryType { 31*6777b538SAndroid Build Coastguard Worker BUNDLE, 32*6777b538SAndroid Build Coastguard Worker DYNAMIC_LIB 33*6777b538SAndroid Build Coastguard Worker }; 34*6777b538SAndroid Build Coastguard Worker enum NativeLibraryObjCStatus { 35*6777b538SAndroid Build Coastguard Worker OBJC_UNKNOWN, 36*6777b538SAndroid Build Coastguard Worker OBJC_PRESENT, 37*6777b538SAndroid Build Coastguard Worker OBJC_NOT_PRESENT, 38*6777b538SAndroid Build Coastguard Worker }; 39*6777b538SAndroid Build Coastguard Worker struct NativeLibraryStruct { 40*6777b538SAndroid Build Coastguard Worker NativeLibraryType type; 41*6777b538SAndroid Build Coastguard Worker NativeLibraryObjCStatus objc_status; 42*6777b538SAndroid Build Coastguard Worker union { 43*6777b538SAndroid Build Coastguard Worker CFBundleRef bundle; 44*6777b538SAndroid Build Coastguard Worker //// This field is not a raw_ptr<> because it was filtered by the rewriter 45*6777b538SAndroid Build Coastguard Worker // for: #union 46*6777b538SAndroid Build Coastguard Worker RAW_PTR_EXCLUSION void* dylib; 47*6777b538SAndroid Build Coastguard Worker }; 48*6777b538SAndroid Build Coastguard Worker }; 49*6777b538SAndroid Build Coastguard Worker using NativeLibrary = NativeLibraryStruct*; 50*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) 51*6777b538SAndroid Build Coastguard Worker using NativeLibrary = void*; 52*6777b538SAndroid Build Coastguard Worker #endif // OS_* 53*6777b538SAndroid Build Coastguard Worker 54*6777b538SAndroid Build Coastguard Worker struct BASE_EXPORT NativeLibraryLoadError { 55*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN) NativeLibraryLoadErrorNativeLibraryLoadError56*6777b538SAndroid Build Coastguard Worker NativeLibraryLoadError() : code(0) {} 57*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_WIN) 58*6777b538SAndroid Build Coastguard Worker 59*6777b538SAndroid Build Coastguard Worker // Returns a string representation of the load error. 60*6777b538SAndroid Build Coastguard Worker std::string ToString() const; 61*6777b538SAndroid Build Coastguard Worker 62*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN) 63*6777b538SAndroid Build Coastguard Worker DWORD code; 64*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) 65*6777b538SAndroid Build Coastguard Worker std::string message; 66*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_WIN) 67*6777b538SAndroid Build Coastguard Worker }; 68*6777b538SAndroid Build Coastguard Worker 69*6777b538SAndroid Build Coastguard Worker struct BASE_EXPORT NativeLibraryOptions { 70*6777b538SAndroid Build Coastguard Worker // If |true|, a loaded library is required to prefer local symbol resolution 71*6777b538SAndroid Build Coastguard Worker // before considering global symbols. Note that this is already the default 72*6777b538SAndroid Build Coastguard Worker // behavior on most systems. Setting this to |false| does not guarantee the 73*6777b538SAndroid Build Coastguard Worker // inverse, i.e., it does not force a preference for global symbols over local 74*6777b538SAndroid Build Coastguard Worker // ones. 75*6777b538SAndroid Build Coastguard Worker bool prefer_own_symbols = false; 76*6777b538SAndroid Build Coastguard Worker }; 77*6777b538SAndroid Build Coastguard Worker 78*6777b538SAndroid Build Coastguard Worker // Loads a native library from disk. Release it with UnloadNativeLibrary when 79*6777b538SAndroid Build Coastguard Worker // you're done. Returns NULL on failure. 80*6777b538SAndroid Build Coastguard Worker // If |error| is not NULL, it may be filled in on load error. 81*6777b538SAndroid Build Coastguard Worker BASE_EXPORT NativeLibrary LoadNativeLibrary(const FilePath& library_path, 82*6777b538SAndroid Build Coastguard Worker NativeLibraryLoadError* error); 83*6777b538SAndroid Build Coastguard Worker 84*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN) 85*6777b538SAndroid Build Coastguard Worker // Loads a native library from the system directory using the appropriate flags. 86*6777b538SAndroid Build Coastguard Worker // The function first checks to see if the library is already loaded and will 87*6777b538SAndroid Build Coastguard Worker // get a handle if so. This method results in a lock that may block the calling 88*6777b538SAndroid Build Coastguard Worker // thread. 89*6777b538SAndroid Build Coastguard Worker BASE_EXPORT NativeLibrary 90*6777b538SAndroid Build Coastguard Worker LoadSystemLibrary(FilePath::StringPieceType name, 91*6777b538SAndroid Build Coastguard Worker NativeLibraryLoadError* error = nullptr); 92*6777b538SAndroid Build Coastguard Worker 93*6777b538SAndroid Build Coastguard Worker // Gets the module handle for the specified system library and pins it to 94*6777b538SAndroid Build Coastguard Worker // ensure it never gets unloaded. If the module is not loaded, it will first 95*6777b538SAndroid Build Coastguard Worker // call LoadSystemLibrary to load it. If the module cannot be pinned, this 96*6777b538SAndroid Build Coastguard Worker // method returns null and includes the error. This method results in a lock 97*6777b538SAndroid Build Coastguard Worker // that may block the calling thread. 98*6777b538SAndroid Build Coastguard Worker BASE_EXPORT NativeLibrary 99*6777b538SAndroid Build Coastguard Worker PinSystemLibrary(FilePath::StringPieceType name, 100*6777b538SAndroid Build Coastguard Worker NativeLibraryLoadError* error = nullptr); 101*6777b538SAndroid Build Coastguard Worker #endif 102*6777b538SAndroid Build Coastguard Worker 103*6777b538SAndroid Build Coastguard Worker // Loads a native library from disk. Release it with UnloadNativeLibrary when 104*6777b538SAndroid Build Coastguard Worker // you're done. Returns NULL on failure. 105*6777b538SAndroid Build Coastguard Worker // If |error| is not NULL, it may be filled in on load error. 106*6777b538SAndroid Build Coastguard Worker BASE_EXPORT NativeLibrary LoadNativeLibraryWithOptions( 107*6777b538SAndroid Build Coastguard Worker const FilePath& library_path, 108*6777b538SAndroid Build Coastguard Worker const NativeLibraryOptions& options, 109*6777b538SAndroid Build Coastguard Worker NativeLibraryLoadError* error); 110*6777b538SAndroid Build Coastguard Worker 111*6777b538SAndroid Build Coastguard Worker // Unloads a native library. 112*6777b538SAndroid Build Coastguard Worker BASE_EXPORT void UnloadNativeLibrary(NativeLibrary library); 113*6777b538SAndroid Build Coastguard Worker 114*6777b538SAndroid Build Coastguard Worker // Gets a function pointer from a native library. 115*6777b538SAndroid Build Coastguard Worker BASE_EXPORT void* GetFunctionPointerFromNativeLibrary(NativeLibrary library, 116*6777b538SAndroid Build Coastguard Worker const char* name); 117*6777b538SAndroid Build Coastguard Worker 118*6777b538SAndroid Build Coastguard Worker // Returns the full platform-specific name for a native library. |name| must be 119*6777b538SAndroid Build Coastguard Worker // ASCII. This is also the default name for the output of a gn |shared_library| 120*6777b538SAndroid Build Coastguard Worker // target. See tools/gn/docs/reference.md#shared_library. 121*6777b538SAndroid Build Coastguard Worker // For example for "mylib", it returns: 122*6777b538SAndroid Build Coastguard Worker // - "mylib.dll" on Windows 123*6777b538SAndroid Build Coastguard Worker // - "libmylib.so" on Linux 124*6777b538SAndroid Build Coastguard Worker // - "libmylib.dylib" on Mac 125*6777b538SAndroid Build Coastguard Worker BASE_EXPORT std::string GetNativeLibraryName(StringPiece name); 126*6777b538SAndroid Build Coastguard Worker 127*6777b538SAndroid Build Coastguard Worker // Returns the full platform-specific name for a gn |loadable_module| target. 128*6777b538SAndroid Build Coastguard Worker // See tools/gn/docs/reference.md#loadable_module 129*6777b538SAndroid Build Coastguard Worker // The returned name is the same as GetNativeLibraryName() on all platforms 130*6777b538SAndroid Build Coastguard Worker // except for Mac where for "mylib" it returns "mylib.so". 131*6777b538SAndroid Build Coastguard Worker BASE_EXPORT std::string GetLoadableModuleName(StringPiece name); 132*6777b538SAndroid Build Coastguard Worker 133*6777b538SAndroid Build Coastguard Worker } // namespace base 134*6777b538SAndroid Build Coastguard Worker 135*6777b538SAndroid Build Coastguard Worker #endif // BASE_NATIVE_LIBRARY_H_ 136