xref: /aosp_15_r20/external/cronet/base/native_library.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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