1// Copyright (c) 2013 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 "crazy_linker_library_view.h"
6
7#include <dlfcn.h>
8#include "crazy_linker_debug.h"
9#include "crazy_linker_globals.h"
10#include "crazy_linker_shared_library.h"
11
12namespace crazy {
13
14LibraryView::~LibraryView() {
15  LOG("%s: Destroying %s\n", __FUNCTION__, name_.c_str());
16  if (type_ == TYPE_SYSTEM) {
17    ::dlclose(system_);
18    system_ = NULL;
19  }
20  if (type_ == TYPE_CRAZY) {
21    delete crazy_;
22    crazy_ = NULL;
23  }
24  type_ = TYPE_NONE;
25}
26
27void* LibraryView::LookupSymbol(const char* symbol_name) {
28  if (type_ == TYPE_SYSTEM)
29    return ::dlsym(system_, symbol_name);
30
31  if (type_ == TYPE_CRAZY) {
32    LibraryList* lib_list = Globals::GetLibraries();
33    return lib_list->FindSymbolFrom(symbol_name, this);
34  }
35
36  return NULL;
37}
38
39bool LibraryView::GetInfo(size_t* load_address,
40                          size_t* load_size,
41                          size_t* relro_start,
42                          size_t* relro_size,
43                          Error* error) {
44  if (type_ != TYPE_CRAZY) {
45    *error = "No RELRO sharing with system libraries";
46    return false;
47  }
48
49  crazy_->GetInfo(load_address, load_size, relro_start, relro_size);
50  return true;
51}
52
53}  // namespace crazy
54