1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef _LIBUNWINDSTACK_TESTS_ELF_FAKE_H 18 #define _LIBUNWINDSTACK_TESTS_ELF_FAKE_H 19 20 #include <stdint.h> 21 22 #include <deque> 23 #include <string> 24 #include <unordered_map> 25 26 #include <unwindstack/Elf.h> 27 #include <unwindstack/ElfInterface.h> 28 #include <unwindstack/Memory.h> 29 #include <unwindstack/Regs.h> 30 31 #include "ElfInterfaceArm.h" 32 33 namespace unwindstack { 34 35 struct StepData { StepDataStepData36 StepData(uint64_t pc, uint64_t sp, bool finished) : pc(pc), sp(sp), finished(finished) {} 37 uint64_t pc; 38 uint64_t sp; 39 bool finished; 40 }; 41 42 struct FunctionData { FunctionDataFunctionData43 FunctionData(std::string name, uint64_t offset) : name(name), offset(offset) {} 44 45 std::string name; 46 uint64_t offset; 47 }; 48 49 class ElfFake : public Elf { 50 public: ElfFake(Memory * memory)51 ElfFake(Memory* memory) : Elf(memory) { valid_ = true; } 52 virtual ~ElfFake() = default; 53 FakeSetValid(bool valid)54 void FakeSetValid(bool valid) { valid_ = valid; } 55 FakeSetLoadBias(uint64_t load_bias)56 void FakeSetLoadBias(uint64_t load_bias) { load_bias_ = load_bias; } 57 FakeSetInterface(ElfInterface * interface)58 void FakeSetInterface(ElfInterface* interface) { interface_.reset(interface); } FakeSetGnuDebugdataInterface(ElfInterface * interface)59 void FakeSetGnuDebugdataInterface(ElfInterface* interface) { 60 gnu_debugdata_interface_.reset(interface); 61 } 62 }; 63 64 class ElfInterfaceFake : public ElfInterface { 65 public: ElfInterfaceFake(Memory * memory)66 ElfInterfaceFake(Memory* memory) : ElfInterface(memory) {} 67 virtual ~ElfInterfaceFake() = default; 68 Init(uint64_t *)69 bool Init(uint64_t*) override { return false; } InitHeaders(uint64_t)70 void InitHeaders(uint64_t) override {} GetSoname()71 std::string GetSoname() override { return fake_soname_; } 72 73 bool GetFunctionName(uint64_t, std::string*, uint64_t*) override; 74 bool GetGlobalVariable(const std::string&, uint64_t*) override; GetBuildID()75 std::string GetBuildID() override { return fake_build_id_; } 76 77 bool Step(uint64_t, Regs*, Memory*, bool*) override; 78 FakeSetGlobalVariable(const std::string & global,uint64_t offset)79 void FakeSetGlobalVariable(const std::string& global, uint64_t offset) { 80 globals_[global] = offset; 81 } 82 FakeSetBuildID(std::string & build_id)83 void FakeSetBuildID(std::string& build_id) { fake_build_id_ = build_id; } FakeSetBuildID(const char * build_id)84 void FakeSetBuildID(const char* build_id) { fake_build_id_ = build_id; } 85 FakeSetSoname(const char * soname)86 void FakeSetSoname(const char* soname) { fake_soname_ = soname; } 87 FakePushFunctionData(const FunctionData data)88 static void FakePushFunctionData(const FunctionData data) { functions_.push_back(data); } FakePushStepData(const StepData data)89 static void FakePushStepData(const StepData data) { steps_.push_back(data); } 90 FakeClear()91 static void FakeClear() { 92 functions_.clear(); 93 steps_.clear(); 94 } 95 FakeSetErrorCode(ErrorCode code)96 void FakeSetErrorCode(ErrorCode code) { last_error_.code = code; } 97 FakeSetErrorAddress(uint64_t address)98 void FakeSetErrorAddress(uint64_t address) { last_error_.address = address; } 99 100 private: 101 std::unordered_map<std::string, uint64_t> globals_; 102 std::string fake_build_id_; 103 std::string fake_soname_; 104 105 static std::deque<FunctionData> functions_; 106 static std::deque<StepData> steps_; 107 }; 108 109 class ElfInterface32Fake : public ElfInterface32 { 110 public: ElfInterface32Fake(Memory * memory)111 ElfInterface32Fake(Memory* memory) : ElfInterface32(memory) {} 112 virtual ~ElfInterface32Fake() = default; 113 FakeSetEhFrameOffset(uint64_t offset)114 void FakeSetEhFrameOffset(uint64_t offset) { eh_frame_offset_ = offset; } FakeSetEhFrameSize(uint64_t size)115 void FakeSetEhFrameSize(uint64_t size) { eh_frame_size_ = size; } FakeSetDebugFrameOffset(uint64_t offset)116 void FakeSetDebugFrameOffset(uint64_t offset) { debug_frame_offset_ = offset; } FakeSetDebugFrameSize(uint64_t size)117 void FakeSetDebugFrameSize(uint64_t size) { debug_frame_size_ = size; } 118 }; 119 120 class ElfInterface64Fake : public ElfInterface64 { 121 public: ElfInterface64Fake(Memory * memory)122 ElfInterface64Fake(Memory* memory) : ElfInterface64(memory) {} 123 virtual ~ElfInterface64Fake() = default; 124 FakeSetEhFrameOffset(uint64_t offset)125 void FakeSetEhFrameOffset(uint64_t offset) { eh_frame_offset_ = offset; } FakeSetEhFrameSize(uint64_t size)126 void FakeSetEhFrameSize(uint64_t size) { eh_frame_size_ = size; } FakeSetDebugFrameOffset(uint64_t offset)127 void FakeSetDebugFrameOffset(uint64_t offset) { debug_frame_offset_ = offset; } FakeSetDebugFrameSize(uint64_t size)128 void FakeSetDebugFrameSize(uint64_t size) { debug_frame_size_ = size; } 129 }; 130 131 class ElfInterfaceArmFake : public ElfInterfaceArm { 132 public: ElfInterfaceArmFake(Memory * memory)133 ElfInterfaceArmFake(Memory* memory) : ElfInterfaceArm(memory) {} 134 virtual ~ElfInterfaceArmFake() = default; 135 FakeSetStartOffset(uint64_t offset)136 void FakeSetStartOffset(uint64_t offset) { start_offset_ = offset; } FakeSetTotalEntries(size_t entries)137 void FakeSetTotalEntries(size_t entries) { total_entries_ = entries; } 138 }; 139 140 } // namespace unwindstack 141 142 #endif // _LIBUNWINDSTACK_TESTS_ELF_FAKE_H 143