blob: 25cbdcb0803791933a691818277ace2b97b72260 [file] [log] [blame]
// 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);