[core] Small refine of ElfImg (#431)
This commit is contained in:
parent
7cea970131
commit
fa97300d58
|
|
@ -23,16 +23,14 @@
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <filesystem>
|
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include "logging.h"
|
#include "logging.h"
|
||||||
#include "elf_util.h"
|
#include "elf_util.h"
|
||||||
|
|
||||||
using namespace SandHook;
|
using namespace SandHook;
|
||||||
namespace fs = std::filesystem;
|
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
inline auto offsetOf(ElfW(Ehdr) *head, ElfW(Off) off) {
|
inline constexpr auto offsetOf(ElfW(Ehdr) *head, ElfW(Off) off) {
|
||||||
return reinterpret_cast<std::conditional_t<std::is_pointer_v<T>, T, T *>>(
|
return reinterpret_cast<std::conditional_t<std::is_pointer_v<T>, T, T *>>(
|
||||||
reinterpret_cast<uintptr_t>(head) + off);
|
reinterpret_cast<uintptr_t>(head) + off);
|
||||||
}
|
}
|
||||||
|
|
@ -68,7 +66,6 @@ ElfImg::ElfImg(std::string_view elf) : elf(elf) {
|
||||||
if (bias == -4396) {
|
if (bias == -4396) {
|
||||||
dynsym = section_h;
|
dynsym = section_h;
|
||||||
dynsym_offset = section_h->sh_offset;
|
dynsym_offset = section_h->sh_offset;
|
||||||
dynsym_size = section_h->sh_size;
|
|
||||||
dynsym_start = offsetOf<decltype(dynsym_start)>(header, dynsym_offset);
|
dynsym_start = offsetOf<decltype(dynsym_start)>(header, dynsym_offset);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
@ -116,8 +113,8 @@ ElfImg::ElfImg(std::string_view elf) : elf(elf) {
|
||||||
gnu_bloom_size_ = d_buf[2];
|
gnu_bloom_size_ = d_buf[2];
|
||||||
gnu_shift2_ = d_buf[3];
|
gnu_shift2_ = d_buf[3];
|
||||||
gnu_bloom_filter_ = reinterpret_cast<decltype(gnu_bloom_filter_)>(d_buf + 4);
|
gnu_bloom_filter_ = reinterpret_cast<decltype(gnu_bloom_filter_)>(d_buf + 4);
|
||||||
gnu_bucket_ = d_buf + 4 + gnu_bloom_size_ *
|
gnu_bucket_ = reinterpret_cast<decltype(gnu_bucket_)>(gnu_bloom_filter_ +
|
||||||
(header->e_ident[EI_CLASS] == ELFCLASS64 ? 2 : 1);
|
gnu_bloom_size_);
|
||||||
gnu_chain_ = gnu_bucket_ + gnu_nbucket_ - gnu_symndx_;
|
gnu_chain_ = gnu_bucket_ + gnu_nbucket_ - gnu_symndx_;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -201,7 +198,8 @@ ElfImg::~ElfImg() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ElfW(Addr) ElfImg::getSymbOffset(std::string_view name, uint32_t gnu_hash, uint32_t elf_hash) const {
|
ElfW(Addr)
|
||||||
|
ElfImg::getSymbOffset(std::string_view name, uint32_t gnu_hash, uint32_t elf_hash) const {
|
||||||
if (auto offset = GnuLookup(name, gnu_hash); offset > 0) {
|
if (auto offset = GnuLookup(name, gnu_hash); offset > 0) {
|
||||||
LOGD("found %s %p in %s in dynsym by gnuhash", name.data(),
|
LOGD("found %s %p in %s in dynsym by gnuhash", name.data(),
|
||||||
reinterpret_cast<void *>(offset), elf.data());
|
reinterpret_cast<void *>(offset), elf.data());
|
||||||
|
|
|
||||||
|
|
@ -85,7 +85,6 @@ namespace SandHook {
|
||||||
ElfW(Off) symtab_offset = 0;
|
ElfW(Off) symtab_offset = 0;
|
||||||
ElfW(Off) dynsym_offset = 0;
|
ElfW(Off) dynsym_offset = 0;
|
||||||
ElfW(Off) symtab_size = 0;
|
ElfW(Off) symtab_size = 0;
|
||||||
ElfW(Off) dynsym_size = 0;
|
|
||||||
|
|
||||||
uint32_t nbucket_{};
|
uint32_t nbucket_{};
|
||||||
uint32_t *bucket_ = nullptr;
|
uint32_t *bucket_ = nullptr;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue