From 3d8abf1c786a55cdaadad3b04a144203c5a25396 Mon Sep 17 00:00:00 2001 From: Robin Nicholson Date: Thu, 15 Mar 2018 19:58:20 +0100 Subject: [PATCH] Change to handle libc-2.27 info for executable --- GOTEntry.cpp | 28 +++++++++------------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/GOTEntry.cpp b/GOTEntry.cpp index ea67de0..7e7c491 100644 --- a/GOTEntry.cpp +++ b/GOTEntry.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -11,7 +12,6 @@ #include #include -#include "elfspy/MFile.h" #include "elfspy/ELFInfo.h" #include "elfspy/Fail.h" #include "elfspy/Report.h" @@ -67,22 +67,15 @@ int read_shared_object(struct dl_phdr_info* info, size_t size, void* data) { // the ELF header for each loaded object unsigned char* elf_root; - const char* name; - if (!info->dlpi_addr) { + const char* name = info->dlpi_name; + if (!*name) { // this is the executable itself - sadly the name was not included in info - elf_root = nullptr; name = program_name.c_str(); - } else { - elf_root = reinterpret_cast(info->dlpi_addr); - name = info->dlpi_name; } + elf_root = reinterpret_cast(info->dlpi_addr); if (name && *name && strncmp(name, "linux-vdso.so", 13) != 0) { - spy::MFile file(name); - spy::ELFInfo elf(file.address(), name); - elf.base_ = elf_root; - elf.size_ = file.size(); - elf.unprotect(elf_root); - elf_objects.push_back(elf); + spy::ELFInfo elf(name); + elf_objects.push_back(elf.prepare_object(elf_root)); auto entries = elf.get_vtables(elf_root); vtables.insert(entries.begin(), entries.end()); } @@ -121,8 +114,7 @@ void* GOTEntry::set(void* function, const char* name) if (offset < object.size_) { // that the offset is inside the size is a tell-tale the symbol can be // found - MFile elf_file(object.name_); - ELFInfo elf(elf_file.address(), object.name_); + ELFInfo elf(object.name_); // find name in elf file where it is defined symbol = elf.get_symbol_rela(offset); if (symbol.rela_offset_) { @@ -140,8 +132,7 @@ void* GOTEntry::set(void* function, const char* name) if (!defined) { // rare case of looking for an STT_IFUNC when not found at all for (auto& object : elf_objects) { - MFile elf_file(object.name_); - ELFInfo elf(elf_file.address(), object.name_); + ELFInfo elf(object.name_); symbol = elf.get_indirect_symbol_rela(object.base_, function); if (symbol.rela_offset_) { // symbol was defined, offset is from the .rela.plt section @@ -161,8 +152,7 @@ void* GOTEntry::set(void* function, const char* name) if (&object == defined) { continue; } - MFile elf_file(object.name_); - ELFInfo elf(elf_file.address(), object.name_); + ELFInfo elf(object.name_); size_t rela_offset = elf.get_symbol_rela_dyn(symbol_name.c_str()); if (rela_offset) { // symbol was undefined, offset is from the .rela.dyn section