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