MCPcopy Create free account
hub / github.com/Simple-XX/SimpleKernel / KernelElf

Method KernelElf

src/include/kernel_elf.hpp:42–101  ·  view source on GitHub ↗

* @brief 构造函数 * @param elf_addr elf 地址 */

Source from the content-addressed store, hash-verified

40 * @param elf_addr elf 地址
41 */
42 explicit KernelElf(uint64_t elf_addr) {
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 // 检查 elf 头数据
48 CheckElfIdentity().or_else([](Error err) -> Expected<void> {
49 klog::Err("KernelElf NOT valid ELF file: {}", err.message());
50 while (true) {
51 cpu_io::Pause();
52 }
53 return {};
54 });
55
56 ehdr_ = *reinterpret_cast<const Elf64_Ehdr*>(elf_.data());
57
58 // 重新计算 elf 大小
59 size_t max_size = EI_NIDENT;
60 if (ehdr_.e_phoff != 0) {
61 size_t ph_end = ehdr_.e_phoff + ehdr_.e_phnum * ehdr_.e_phentsize;
62 if (ph_end > max_size) {
63 max_size = ph_end;
64 }
65 }
66 if (ehdr_.e_shoff != 0) {
67 size_t sh_end = ehdr_.e_shoff + ehdr_.e_shnum * ehdr_.e_shentsize;
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),
84 ehdr_.e_phnum);
85
86 shdr_ = std::span<Elf64_Shdr>(
87 reinterpret_cast<Elf64_Shdr*>(elf_.data() + ehdr_.e_shoff),
88 ehdr_.e_shnum);
89
90 const auto* shstrtab = reinterpret_cast<const char*>(elf_.data()) +
91 shdr_[ehdr_.e_shstrndx].sh_offset;
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) {
98 strtab = elf_.data() + shdr.sh_offset;
99 }

Callers

nothing calls this directly

Calls 4

ErrFunction · 0.85
PauseFunction · 0.85
strcmpFunction · 0.85
messageMethod · 0.80

Tested by

no test coverage detected