42 {
43 assert(elf_addr != 0U && "elf_addr is null");
44
45 elf_ = std::span<uint8_t>(
reinterpret_cast<uint8_t*
>(elf_addr), EI_NIDENT);
46
47
50 while (true) {
52 }
53 return {};
54 });
55
56 ehdr_ = *
reinterpret_cast<const Elf64_Ehdr*
>(
elf_.data());
57
58
59 size_t max_size = EI_NIDENT;
60 if (
ehdr_.e_phoff != 0) {
62 if (ph_end > max_size) {
63 max_size = ph_end;
64 }
65 }
66 if (
ehdr_.e_shoff != 0) {
68 if (sh_end > max_size) {
69 max_size = sh_end;
70 }
71 const auto* shdrs =
72 reinterpret_cast<const Elf64_Shdr*
>(
elf_.data() +
ehdr_.e_shoff);
73 for (
int i = 0; i <
ehdr_.e_shnum; ++i) {
74 size_t section_end = shdrs[i].sh_offset + shdrs[i].sh_size;
75 if (section_end > max_size) {
76 max_size = section_end;
77 }
78 }
79 }
80 elf_ = std::span<uint8_t>(
reinterpret_cast<uint8_t*
>(elf_addr), max_size);
81
82 phdr_ = std::span<Elf64_Phdr>(
83 reinterpret_cast<Elf64_Phdr*
>(
elf_.data() +
ehdr_.e_phoff),
85
86 shdr_ = std::span<Elf64_Shdr>(
87 reinterpret_cast<Elf64_Shdr*
>(
elf_.data() +
ehdr_.e_shoff),
89
90 const auto* shstrtab =
reinterpret_cast<const char*
>(
elf_.data()) +
92 for (
auto shdr :
shdr_) {
93 if (
strcmp(shstrtab + shdr.sh_name,
".symtab") == 0) {
94 symtab = std::span<Elf64_Sym>(
95 reinterpret_cast<Elf64_Sym*
>(
elf_.data() + shdr.sh_offset),
96 (shdr.sh_size / sizeof(Elf64_Sym)));
97 }
else if (
strcmp(shstrtab + shdr.sh_name,
".strtab") == 0) {
99 }
100 }
101 }
std::span< uint8_t > elf_
std::span< Elf64_Shdr > shdr_
std::span< Elf64_Phdr > phdr_
auto CheckElfIdentity() const -> Expected< void >
std::span< Elf64_Sym > symtab
符号表
std::expected< T, Error > Expected
std::expected 别名模板
auto Err(etl::format_string< Args... > fmt, Args &&... args) -> void
以 ERROR 级别记录日志
constexpr auto message() const -> const char *