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/file_path.h"
10#include "base/logging.h"
11#include "base/threading/thread_restrictions.h"
12#include "base/utf_string_conversions.h"
13
14namespace base {
15
16// static
17NativeLibrary LoadNativeLibrary(const FilePath& library_path,
18                                std::string* error) {
19  // dlopen() opens the file off disk.
20  base::ThreadRestrictions::AssertIOAllowed();
21
22  // We deliberately do not use RTLD_DEEPBIND.  For the history why, please
23  // refer to the bug tracker.  Some useful bug reports to read include:
24  // http://crbug.com/17943, http://crbug.com/17557, http://crbug.com/36892,
25  // and http://crbug.com/40794.
26  void* dl = dlopen(library_path.value().c_str(), RTLD_LAZY);
27  if (!dl && error)
28    *error = dlerror();
29
30  return dl;
31}
32
33// static
34void UnloadNativeLibrary(NativeLibrary library) {
35  int ret = dlclose(library);
36  if (ret < 0) {
37    LOG(ERROR) << "dlclose failed: " << dlerror();
38    NOTREACHED();
39  }
40}
41
42// static
43void* GetFunctionPointerFromNativeLibrary(NativeLibrary library,
44                                          const char* name) {
45  return dlsym(library, name);
46}
47
48// static
49string16 GetNativeLibraryName(const string16& name) {
50  return ASCIIToUTF16("lib") + name + ASCIIToUTF16(".so");
51}
52
53}  // namespace base
54