1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// found in the LICENSE file.
4f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "crazy_linker_library_view.h"
6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <dlfcn.h>
8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "crazy_linker_debug.h"
9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "crazy_linker_globals.h"
10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "crazy_linker_shared_library.h"
11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace crazy {
13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)LibraryView::~LibraryView() {
15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  LOG("%s: Destroying %s\n", __FUNCTION__, name_.c_str());
16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (type_ == TYPE_SYSTEM) {
17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    ::dlclose(system_);
18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    system_ = NULL;
19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (type_ == TYPE_CRAZY) {
21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    delete crazy_;
22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    crazy_ = NULL;
23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  type_ = TYPE_NONE;
25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void* LibraryView::LookupSymbol(const char* symbol_name) {
28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (type_ == TYPE_SYSTEM)
29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return ::dlsym(system_, symbol_name);
30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (type_ == TYPE_CRAZY) {
32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    LibraryList* lib_list = Globals::GetLibraries();
33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return lib_list->FindSymbolFrom(symbol_name, this);
34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return NULL;
37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool LibraryView::GetInfo(size_t* load_address,
40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                          size_t* load_size,
41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                          size_t* relro_start,
42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                          size_t* relro_size,
43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                          Error* error) {
44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (type_ != TYPE_CRAZY) {
45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    *error = "No RELRO sharing with system libraries";
46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return false;
47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  crazy_->GetInfo(load_address, load_size, relro_start, relro_size);
50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return true;
51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}  // namespace crazy
54