blob: f8d2f8e10b76385812d0d1d70902c03f0d7d26b5 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "crazy_linker_library_view.h"
#include "crazy_linker_debug.h"
#include "crazy_linker_globals.h"
#include "crazy_linker_shared_library.h"
#include "crazy_linker_system_linker.h"
namespace crazy {
LibraryView::LibraryView(SharedLibrary* crazy_lib)
: type_(TYPE_CRAZY), crazy_(crazy_lib), name_(crazy_lib->soname()) {}
LibraryView::~LibraryView() {
LOG("Destroying %s", name_.c_str());
if (type_ == TYPE_SYSTEM) {
SystemLinker::Close(system_);
system_ = NULL;
} else if (type_ == TYPE_CRAZY) {
delete crazy_;
crazy_ = NULL;
}
type_ = TYPE_NONE;
}
LibraryView::SearchResult LibraryView::LookupSymbol(
const char* symbol_name) const {
if (type_ == TYPE_SYSTEM) {
SystemLinker::SearchResult result =
SystemLinker::Resolve(system_, symbol_name);
if (result.IsValid()) {
return {result.address, this};
}
} else if (type_ == TYPE_CRAZY) {
LibraryList* lib_list = Globals::Get()->libraries();
void* address = lib_list->FindSymbolFrom(symbol_name, this);
if (address) {
return {address, this};
}
}
return {};
}
bool LibraryView::GetInfo(size_t* load_address,
size_t* load_size,
size_t* relro_start,
size_t* relro_size,
Error* error) const {
if (type_ != TYPE_CRAZY) {
*error = "No RELRO sharing with system libraries";
return false;
}
crazy_->GetInfo(load_address, load_size, relro_start, relro_size);
return true;
}
} // namespace crazy