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