1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "base/native_library.h" 6 7 #include <dlfcn.h> 8 9 #include "base/files/file_path.h" 10 #include "base/logging.h" 11 #include "base/strings/utf_string_conversions.h" 12 #include "base/threading/thread_restrictions.h" 13 14 namespace base { 15 16 std::string NativeLibraryLoadError::ToString() const { 17 return message; 18 } 19 20 // static 21 NativeLibrary LoadNativeLibrary(const FilePath& library_path, 22 NativeLibraryLoadError* error) { 23 // dlopen() opens the file off disk. 24 base::ThreadRestrictions::AssertIOAllowed(); 25 26 // We deliberately do not use RTLD_DEEPBIND. For the history why, please 27 // refer to the bug tracker. Some useful bug reports to read include: 28 // http://crbug.com/17943, http://crbug.com/17557, http://crbug.com/36892, 29 // and http://crbug.com/40794. 30 void* dl = dlopen(library_path.value().c_str(), RTLD_LAZY); 31 if (!dl && error) 32 error->message = dlerror(); 33 34 return dl; 35 } 36 37 // static 38 void UnloadNativeLibrary(NativeLibrary library) { 39 int ret = dlclose(library); 40 if (ret < 0) { 41 DLOG(ERROR) << "dlclose failed: " << dlerror(); 42 NOTREACHED(); 43 } 44 } 45 46 // static 47 void* GetFunctionPointerFromNativeLibrary(NativeLibrary library, 48 const char* name) { 49 return dlsym(library, name); 50 } 51 52 // static 53 string16 GetNativeLibraryName(const string16& name) { 54 return ASCIIToUTF16("lib") + name + ASCIIToUTF16(".so"); 55 } 56 57 } // namespace base 58