| // Copyright 2016 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #pragma once |
| |
| #include <elf.h> |
| #include <fbl/array.h> |
| #include <fbl/function.h> |
| #include <fbl/string_piece.h> |
| #include <lib/zx/process.h> |
| #include <stdint.h> |
| |
| // TODO(jakehehrlich): Replace ArrayRef here with something more like std::span |
| // in fbl. |
| template <class T> |
| class ArrayRef { |
| public: |
| ArrayRef() = default; |
| template <size_t N> |
| ArrayRef(const T (&arr)[N]) |
| : ptr_(arr), sz_(N) {} |
| ArrayRef(const fbl::Array<T>& arr) |
| : ptr_(arr.get()), sz_(arr.size()) {} |
| ArrayRef(const T* ptr, size_t sz) |
| : ptr_(ptr), sz_(sz) {} |
| |
| bool empty() const { |
| return sz_ == 0; |
| } |
| |
| const T* get() const { |
| return ptr_; |
| } |
| |
| const T* begin() const { |
| return ptr_; |
| } |
| |
| const T* end() const { |
| return ptr_ + sz_; |
| } |
| |
| size_t size() const { |
| return sz_; |
| } |
| |
| const T& operator[](size_t idx) const { |
| return ptr_[idx]; |
| } |
| |
| private: |
| const T* ptr_ = nullptr; |
| size_t sz_ = 0; |
| }; |
| |
| template <class T> |
| bool operator==(ArrayRef<T> a, ArrayRef<T> b) { |
| if (a.size() != b.size()) { |
| return false; |
| } |
| for (size_t i = 0; i < a.size(); ++i) { |
| if (a[i] != b[i]) { |
| return false; |
| } |
| } |
| return true; |
| } |
| |
| template <typename T> |
| ArrayRef<T> MakeArrayRef(const T* p, size_t sz) { |
| return {p, sz}; |
| } |
| |
| template <typename T, size_t N> |
| ArrayRef<T> MakeArrayRef(const T (&arr)[N]) { |
| return {arr}; |
| } |
| |
| struct ModuleInfo { |
| fbl::StringPiece name; |
| uintptr_t vaddr; |
| ArrayRef<uint8_t> build_id; |
| const Elf64_Ehdr& ehdr; |
| ArrayRef<Elf64_Phdr> phdrs; |
| }; |
| |
| #if defined(__aarch64__) |
| constexpr Elf64_Half kNativeElfMachine = EM_AARCH64; |
| #elif defined(__x86_64__) |
| constexpr Elf64_Half kNativeElfMachine = EM_X86_64; |
| #endif |
| |
| using ModuleAction = fbl::Function<void(const ModuleInfo&)>; |
| extern zx_status_t ForEachModule(const zx::process&, ModuleAction); |