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 14namespace base { 15 16std::string NativeLibraryLoadError::ToString() const { 17 return message; 18} 19 20// static 21NativeLibrary 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 38void 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 47void* GetFunctionPointerFromNativeLibrary(NativeLibrary library, 48 const char* name) { 49 return dlsym(library, name); 50} 51 52// static 53string16 GetNativeLibraryName(const string16& name) { 54 return ASCIIToUTF16("lib") + name + ASCIIToUTF16(".so"); 55} 56 57} // namespace base 58