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