xref: /aosp_15_r20/external/libchrome/base/native_library.h (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
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