// 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.

#ifndef CRAZY_LINKER_LIBRARY_LIST_H
#define CRAZY_LINKER_LIBRARY_LIST_H

#include <link.h>

#include "crazy_linker_error.h"
#include "crazy_linker_search_path_list.h"
#include "elf_traits.h"

// This header contains definitions related to the global list of
// library views maintained by the crazy linker. Each library view
// points to either a crazy library, or a system one.

namespace crazy {

class SharedLibrary;
class LibraryView;

// The list of all shared libraries loaded by the crazy linker.
// IMPORTANT: This class is not thread-safe!
class LibraryList {
 public:
  LibraryList();
  ~LibraryList();

  // Find a library in the list by its base name.
  // |base_name| must not contain a directory separator.
  LibraryView* FindLibraryByName(const char* base_name);

  // Lookup for a given |symbol_name|, starting from |from_lib|
  // then through its dependencies in breadth-first search order.
  // On failure, returns NULL.
  void* FindSymbolFrom(const char* symbol_name, const LibraryView* from_lib);

  // Return the address of a visible given symbol. Used to implement
  // the dlsym() wrapper. Returns NULL on failure.
  void* FindAddressForSymbol(const char* symbol_name);

  // Find a SharedLibrary that contains a given address, or NULL if none
  // could be found. This simply scans all libraries.
  LibraryView* FindLibraryForAddress(void* address);

#ifdef __arm__
  // Find the base address of the .ARM.exidx section corresponding
  // to the address |pc|, as well as the number of 8-byte entries in
  // the table into |*count|. Used to implement the wrapper for
  // dl_unwind_find_exidx().
  _Unwind_Ptr FindArmExIdx(void* pc, int* count);
#else
  typedef int (*PhdrIterationCallback)(dl_phdr_info* info,
                                       size_t info_size,
                                       void* data);

  // Loop over all loaded libraries and call the |cb| callback
  // on each iteration. If the function returns 0, stop immediately
  // and return its value. Used to implement the wrapper for
  // dl_iterate_phdr().
  int IteratePhdr(PhdrIterationCallback callback, void* data);
#endif

  // Try to load a library, possibly at a fixed address.
  // On failure, returns NULL and sets the |error| message.
  LibraryView* LoadLibrary(const char* path,
                           uintptr_t load_address,
                           SearchPathList* search_path_list,
                           Error* error);

  // Unload a given shared library. This really decrements the library's
  // internal reference count. When it reaches zero, the library's
  // destructors are run, its dependencies are unloaded, then the
  // library is removed from memory.
  void UnloadLibrary(LibraryView* lib);

  // Used internally by the wrappers only.
  void AddLibrary(LibraryView* lib);

 private:
  LibraryList(const LibraryList&);
  LibraryList& operator=(const LibraryList&);

  // Preload any libraries that override symbols in later loads.
  // Called once only, on library list construction. Libraries to preload
  // are controlled by LD_PRELOAD.
  void LoadPreloads();

  // Load a library with the system linker and a specific set of flags.
  // |lib_name| is the library name or path, |dlopen_flags| should be
  // a set of RTLD_XXX flags. On success, return a new LibraryView pointer.
  // On failure, set |*error| then return nullptr.
  LibraryView* LoadLibraryWithSystemLinker(const char* lib_name,
                                           int dlopen_flags,
                                           Error* error);

  void ClearError();

  // The list of all preloaded libraries.
  Vector<LibraryView*> preloaded_libraries_;

  // The list of all known libraries.
  Vector<LibraryView*> known_libraries_;

  // Find whether a library identified by |name| has already been loaded.
  // Note that |name| should correspond to the library's unique soname, which
  // comes from its DT_SONAME entry, and typically, but not necessarily
  // matches its base name.
  LibraryView* FindKnownLibrary(const char* name);

  // The list of all libraries loaded by the crazy linker.
  // This does _not_ include system libraries present in known_libraries_.
  SharedLibrary* head_ = nullptr;

  bool has_error_ = false;
  char error_buffer_[512];
};

}  // namespace crazy

#endif  // CRAZY_LINKER_LIBRARY_LIST_H
