1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file. 4*635a8641SAndroid Build Coastguard Worker 5*635a8641SAndroid Build Coastguard Worker #ifndef BASE_NATIVE_LIBRARY_H_ 6*635a8641SAndroid Build Coastguard Worker #define BASE_NATIVE_LIBRARY_H_ 7*635a8641SAndroid Build Coastguard Worker 8*635a8641SAndroid Build Coastguard Worker // This file defines a cross-platform "NativeLibrary" type which represents 9*635a8641SAndroid Build Coastguard Worker // a loadable module. 10*635a8641SAndroid Build Coastguard Worker 11*635a8641SAndroid Build Coastguard Worker #include <string> 12*635a8641SAndroid Build Coastguard Worker 13*635a8641SAndroid Build Coastguard Worker #include "base/base_export.h" 14*635a8641SAndroid Build Coastguard Worker #include "base/strings/string_piece.h" 15*635a8641SAndroid Build Coastguard Worker #include "build/build_config.h" 16*635a8641SAndroid Build Coastguard Worker 17*635a8641SAndroid Build Coastguard Worker #if defined(OS_WIN) 18*635a8641SAndroid Build Coastguard Worker #include <windows.h> 19*635a8641SAndroid Build Coastguard Worker #elif defined(OS_MACOSX) 20*635a8641SAndroid Build Coastguard Worker #import <CoreFoundation/CoreFoundation.h> 21*635a8641SAndroid Build Coastguard Worker #endif // OS_* 22*635a8641SAndroid Build Coastguard Worker 23*635a8641SAndroid Build Coastguard Worker namespace base { 24*635a8641SAndroid Build Coastguard Worker 25*635a8641SAndroid Build Coastguard Worker class FilePath; 26*635a8641SAndroid Build Coastguard Worker 27*635a8641SAndroid Build Coastguard Worker #if defined(OS_WIN) 28*635a8641SAndroid Build Coastguard Worker using NativeLibrary = HMODULE; 29*635a8641SAndroid Build Coastguard Worker #elif defined(OS_MACOSX) 30*635a8641SAndroid Build Coastguard Worker enum NativeLibraryType { 31*635a8641SAndroid Build Coastguard Worker BUNDLE, 32*635a8641SAndroid Build Coastguard Worker DYNAMIC_LIB 33*635a8641SAndroid Build Coastguard Worker }; 34*635a8641SAndroid Build Coastguard Worker enum NativeLibraryObjCStatus { 35*635a8641SAndroid Build Coastguard Worker OBJC_UNKNOWN, 36*635a8641SAndroid Build Coastguard Worker OBJC_PRESENT, 37*635a8641SAndroid Build Coastguard Worker OBJC_NOT_PRESENT, 38*635a8641SAndroid Build Coastguard Worker }; 39*635a8641SAndroid Build Coastguard Worker struct NativeLibraryStruct { 40*635a8641SAndroid Build Coastguard Worker NativeLibraryType type; 41*635a8641SAndroid Build Coastguard Worker CFBundleRefNum bundle_resource_ref; 42*635a8641SAndroid Build Coastguard Worker NativeLibraryObjCStatus objc_status; 43*635a8641SAndroid Build Coastguard Worker union { 44*635a8641SAndroid Build Coastguard Worker CFBundleRef bundle; 45*635a8641SAndroid Build Coastguard Worker void* dylib; 46*635a8641SAndroid Build Coastguard Worker }; 47*635a8641SAndroid Build Coastguard Worker }; 48*635a8641SAndroid Build Coastguard Worker using NativeLibrary = NativeLibraryStruct*; 49*635a8641SAndroid Build Coastguard Worker #elif defined(OS_POSIX) || defined(OS_FUCHSIA) 50*635a8641SAndroid Build Coastguard Worker using NativeLibrary = void*; 51*635a8641SAndroid Build Coastguard Worker #endif // OS_* 52*635a8641SAndroid Build Coastguard Worker 53*635a8641SAndroid Build Coastguard Worker struct BASE_EXPORT NativeLibraryLoadError { 54*635a8641SAndroid Build Coastguard Worker #if defined(OS_WIN) NativeLibraryLoadErrorNativeLibraryLoadError55*635a8641SAndroid Build Coastguard Worker NativeLibraryLoadError() : code(0) {} 56*635a8641SAndroid Build Coastguard Worker #endif // OS_WIN 57*635a8641SAndroid Build Coastguard Worker 58*635a8641SAndroid Build Coastguard Worker // Returns a string representation of the load error. 59*635a8641SAndroid Build Coastguard Worker std::string ToString() const; 60*635a8641SAndroid Build Coastguard Worker 61*635a8641SAndroid Build Coastguard Worker #if defined(OS_WIN) 62*635a8641SAndroid Build Coastguard Worker DWORD code; 63*635a8641SAndroid Build Coastguard Worker #elif defined(OS_POSIX) || defined(OS_FUCHSIA) 64*635a8641SAndroid Build Coastguard Worker std::string message; 65*635a8641SAndroid Build Coastguard Worker #endif // OS_WIN 66*635a8641SAndroid Build Coastguard Worker }; 67*635a8641SAndroid Build Coastguard Worker 68*635a8641SAndroid Build Coastguard Worker struct BASE_EXPORT NativeLibraryOptions { 69*635a8641SAndroid Build Coastguard Worker NativeLibraryOptions() = default; 70*635a8641SAndroid Build Coastguard Worker NativeLibraryOptions(const NativeLibraryOptions& options) = default; 71*635a8641SAndroid Build Coastguard Worker 72*635a8641SAndroid Build Coastguard Worker // If |true|, a loaded library is required to prefer local symbol resolution 73*635a8641SAndroid Build Coastguard Worker // before considering global symbols. Note that this is already the default 74*635a8641SAndroid Build Coastguard Worker // behavior on most systems. Setting this to |false| does not guarantee the 75*635a8641SAndroid Build Coastguard Worker // inverse, i.e., it does not force a preference for global symbols over local 76*635a8641SAndroid Build Coastguard Worker // ones. 77*635a8641SAndroid Build Coastguard Worker bool prefer_own_symbols = false; 78*635a8641SAndroid Build Coastguard Worker }; 79*635a8641SAndroid Build Coastguard Worker 80*635a8641SAndroid Build Coastguard Worker // Loads a native library from disk. Release it with UnloadNativeLibrary when 81*635a8641SAndroid Build Coastguard Worker // you're done. Returns NULL on failure. 82*635a8641SAndroid Build Coastguard Worker // If |error| is not NULL, it may be filled in on load error. 83*635a8641SAndroid Build Coastguard Worker BASE_EXPORT NativeLibrary LoadNativeLibrary(const FilePath& library_path, 84*635a8641SAndroid Build Coastguard Worker NativeLibraryLoadError* error); 85*635a8641SAndroid Build Coastguard Worker 86*635a8641SAndroid Build Coastguard Worker // Loads a native library from disk. Release it with UnloadNativeLibrary when 87*635a8641SAndroid Build Coastguard Worker // you're done. Returns NULL on failure. 88*635a8641SAndroid Build Coastguard Worker // If |error| is not NULL, it may be filled in on load error. 89*635a8641SAndroid Build Coastguard Worker BASE_EXPORT NativeLibrary LoadNativeLibraryWithOptions( 90*635a8641SAndroid Build Coastguard Worker const FilePath& library_path, 91*635a8641SAndroid Build Coastguard Worker const NativeLibraryOptions& options, 92*635a8641SAndroid Build Coastguard Worker NativeLibraryLoadError* error); 93*635a8641SAndroid Build Coastguard Worker 94*635a8641SAndroid Build Coastguard Worker // Unloads a native library. 95*635a8641SAndroid Build Coastguard Worker BASE_EXPORT void UnloadNativeLibrary(NativeLibrary library); 96*635a8641SAndroid Build Coastguard Worker 97*635a8641SAndroid Build Coastguard Worker // Gets a function pointer from a native library. 98*635a8641SAndroid Build Coastguard Worker BASE_EXPORT void* GetFunctionPointerFromNativeLibrary(NativeLibrary library, 99*635a8641SAndroid Build Coastguard Worker StringPiece name); 100*635a8641SAndroid Build Coastguard Worker 101*635a8641SAndroid Build Coastguard Worker // Returns the full platform-specific name for a native library. |name| must be 102*635a8641SAndroid Build Coastguard Worker // ASCII. This is also the default name for the output of a gn |shared_library| 103*635a8641SAndroid Build Coastguard Worker // target. See tools/gn/docs/reference.md#shared_library. 104*635a8641SAndroid Build Coastguard Worker // For example for "mylib", it returns: 105*635a8641SAndroid Build Coastguard Worker // - "mylib.dll" on Windows 106*635a8641SAndroid Build Coastguard Worker // - "libmylib.so" on Linux 107*635a8641SAndroid Build Coastguard Worker // - "libmylib.dylib" on Mac 108*635a8641SAndroid Build Coastguard Worker BASE_EXPORT std::string GetNativeLibraryName(StringPiece name); 109*635a8641SAndroid Build Coastguard Worker 110*635a8641SAndroid Build Coastguard Worker // Returns the full platform-specific name for a gn |loadable_module| target. 111*635a8641SAndroid Build Coastguard Worker // See tools/gn/docs/reference.md#loadable_module 112*635a8641SAndroid Build Coastguard Worker // The returned name is the same as GetNativeLibraryName() on all platforms 113*635a8641SAndroid Build Coastguard Worker // except for Mac where for "mylib" it returns "mylib.so". 114*635a8641SAndroid Build Coastguard Worker BASE_EXPORT std::string GetLoadableModuleName(StringPiece name); 115*635a8641SAndroid Build Coastguard Worker 116*635a8641SAndroid Build Coastguard Worker } // namespace base 117*635a8641SAndroid Build Coastguard Worker 118*635a8641SAndroid Build Coastguard Worker #endif // BASE_NATIVE_LIBRARY_H_ 119