xref: /aosp_15_r20/external/cronet/base/native_library_posix.cc (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 #include "base/native_library.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <dlfcn.h>
8*6777b538SAndroid Build Coastguard Worker 
9*6777b538SAndroid Build Coastguard Worker #include "base/files/file_path.h"
10*6777b538SAndroid Build Coastguard Worker #include "base/logging.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/notreached.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/strings/strcat.h"
13*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_piece.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_util.h"
15*6777b538SAndroid Build Coastguard Worker #include "base/strings/utf_string_conversions.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/threading/scoped_blocking_call.h"
17*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
18*6777b538SAndroid Build Coastguard Worker 
19*6777b538SAndroid Build Coastguard Worker namespace base {
20*6777b538SAndroid Build Coastguard Worker 
ToString() const21*6777b538SAndroid Build Coastguard Worker std::string NativeLibraryLoadError::ToString() const {
22*6777b538SAndroid Build Coastguard Worker   return message;
23*6777b538SAndroid Build Coastguard Worker }
24*6777b538SAndroid Build Coastguard Worker 
LoadNativeLibraryWithOptions(const FilePath & library_path,const NativeLibraryOptions & options,NativeLibraryLoadError * error)25*6777b538SAndroid Build Coastguard Worker NativeLibrary LoadNativeLibraryWithOptions(const FilePath& library_path,
26*6777b538SAndroid Build Coastguard Worker                                            const NativeLibraryOptions& options,
27*6777b538SAndroid Build Coastguard Worker                                            NativeLibraryLoadError* error) {
28*6777b538SAndroid Build Coastguard Worker   // dlopen() opens the file off disk.
29*6777b538SAndroid Build Coastguard Worker   ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK);
30*6777b538SAndroid Build Coastguard Worker 
31*6777b538SAndroid Build Coastguard Worker   // We deliberately do not use RTLD_DEEPBIND by default.  For the history why,
32*6777b538SAndroid Build Coastguard Worker   // please refer to the bug tracker.  Some useful bug reports to read include:
33*6777b538SAndroid Build Coastguard Worker   // http://crbug.com/17943, http://crbug.com/17557, http://crbug.com/36892,
34*6777b538SAndroid Build Coastguard Worker   // and http://crbug.com/40794.
35*6777b538SAndroid Build Coastguard Worker   int flags = RTLD_LAZY;
36*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID) || !defined(RTLD_DEEPBIND)
37*6777b538SAndroid Build Coastguard Worker   // Certain platforms don't define RTLD_DEEPBIND. Android dlopen() requires
38*6777b538SAndroid Build Coastguard Worker   // further investigation, as it might vary across versions. Crash here to
39*6777b538SAndroid Build Coastguard Worker   // warn developers that they're trying to rely on uncertain behavior.
40*6777b538SAndroid Build Coastguard Worker   CHECK(!options.prefer_own_symbols);
41*6777b538SAndroid Build Coastguard Worker #else
42*6777b538SAndroid Build Coastguard Worker   if (options.prefer_own_symbols)
43*6777b538SAndroid Build Coastguard Worker     flags |= RTLD_DEEPBIND;
44*6777b538SAndroid Build Coastguard Worker #endif
45*6777b538SAndroid Build Coastguard Worker   void* dl = dlopen(library_path.value().c_str(), flags);
46*6777b538SAndroid Build Coastguard Worker   if (!dl && error)
47*6777b538SAndroid Build Coastguard Worker     error->message = dlerror();
48*6777b538SAndroid Build Coastguard Worker 
49*6777b538SAndroid Build Coastguard Worker   return dl;
50*6777b538SAndroid Build Coastguard Worker }
51*6777b538SAndroid Build Coastguard Worker 
UnloadNativeLibrary(NativeLibrary library)52*6777b538SAndroid Build Coastguard Worker void UnloadNativeLibrary(NativeLibrary library) {
53*6777b538SAndroid Build Coastguard Worker   int ret = dlclose(library);
54*6777b538SAndroid Build Coastguard Worker   if (ret < 0) {
55*6777b538SAndroid Build Coastguard Worker     DLOG(ERROR) << "dlclose failed: " << dlerror();
56*6777b538SAndroid Build Coastguard Worker     NOTREACHED();
57*6777b538SAndroid Build Coastguard Worker   }
58*6777b538SAndroid Build Coastguard Worker }
59*6777b538SAndroid Build Coastguard Worker 
GetFunctionPointerFromNativeLibrary(NativeLibrary library,const char * name)60*6777b538SAndroid Build Coastguard Worker void* GetFunctionPointerFromNativeLibrary(NativeLibrary library,
61*6777b538SAndroid Build Coastguard Worker                                           const char* name) {
62*6777b538SAndroid Build Coastguard Worker   return dlsym(library, name);
63*6777b538SAndroid Build Coastguard Worker }
64*6777b538SAndroid Build Coastguard Worker 
GetNativeLibraryName(StringPiece name)65*6777b538SAndroid Build Coastguard Worker std::string GetNativeLibraryName(StringPiece name) {
66*6777b538SAndroid Build Coastguard Worker   DCHECK(IsStringASCII(name));
67*6777b538SAndroid Build Coastguard Worker   return StrCat({"lib", name, ".so"});
68*6777b538SAndroid Build Coastguard Worker }
69*6777b538SAndroid Build Coastguard Worker 
GetLoadableModuleName(StringPiece name)70*6777b538SAndroid Build Coastguard Worker std::string GetLoadableModuleName(StringPiece name) {
71*6777b538SAndroid Build Coastguard Worker   return GetNativeLibraryName(name);
72*6777b538SAndroid Build Coastguard Worker }
73*6777b538SAndroid Build Coastguard Worker 
74*6777b538SAndroid Build Coastguard Worker }  // namespace base
75