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 #ifndef CRAZY_LINKER_LIBRARY_VIEW_H
6 #define CRAZY_LINKER_LIBRARY_VIEW_H
7 
8 #include "crazy_linker_error.h"
9 #include "crazy_linker_util.h"
10 
11 namespace crazy {
12 
13 class SharedLibrary;
14 
15 // A LibraryView is a reference-counted handle to either a
16 // crazy::SharedLibrary object or a library handle returned by the system's
17 // dlopen() function.
18 //
19 // It has a name, which is always a base name, because only one
20 // library with a given base name can be loaded in the system.
21 class LibraryView {
22  public:
23   enum {
24     TYPE_NONE = 0xbaadbaad,
25     TYPE_SYSTEM = 0x2387cef,
26     TYPE_CRAZY = 0xcdef2387,
27   };
28 
LibraryView()29   LibraryView()
30       : type_(TYPE_NONE), crazy_(NULL), system_(NULL), name_(), ref_count_(1) {}
31 
32   ~LibraryView();
33 
IsSystem()34   bool IsSystem() const { return type_ == TYPE_SYSTEM; }
35 
IsCrazy()36   bool IsCrazy() const { return type_ == TYPE_CRAZY; }
37 
SetSystem(void * system_lib,const char * name)38   void SetSystem(void* system_lib, const char* name) {
39     type_ = TYPE_SYSTEM;
40     system_ = system_lib;
41     name_ = name;
42   }
43 
SetCrazy(SharedLibrary * crazy_lib,const char * name)44   void SetCrazy(SharedLibrary* crazy_lib, const char* name) {
45     type_ = TYPE_CRAZY;
46     crazy_ = crazy_lib;
47     name_ = name;
48   }
49 
GetName()50   const char* GetName() { return name_.c_str(); }
51 
GetCrazy()52   SharedLibrary* GetCrazy() { return IsCrazy() ? crazy_ : NULL; }
53 
GetSystem()54   void* GetSystem() { return IsSystem() ? system_ : NULL; }
55 
AddRef()56   void AddRef() { ref_count_++; }
57 
58   // Decrement reference count. Returns true iff it reaches 0.
59   // This never destroys the object.
SafeDecrementRef()60   bool SafeDecrementRef() { return (--ref_count_ == 0); }
61 
62   // Lookup a symbol from this library.
63   // If this is a crazy library, perform a breadth-first search,
64   // for system libraries, use dlsym() instead.
65   void* LookupSymbol(const char* symbol_name);
66 
67   // Retrieve library information.
68   bool GetInfo(size_t* load_address,
69                size_t* load_size,
70                size_t* relro_start,
71                size_t* relro_size,
72                Error* error);
73 
74   // Only used for debugging.
ref_count()75   int ref_count() const { return ref_count_; }
76 
77  private:
78   uint32_t type_;
79   SharedLibrary* crazy_;
80   void* system_;
81   String name_;
82   int ref_count_;
83 };
84 
85 }  // namespace crazy
86 
87 #endif  // CRAZY_LINKER_LIBRARY_VIEW_H