summaryrefslogtreecommitdiff
path: root/src/patchelf.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/patchelf.h')
-rw-r--r--src/patchelf.h38
1 files changed, 36 insertions, 2 deletions
diff --git a/src/patchelf.h b/src/patchelf.h
index 9fab18c..4e229d6 100644
--- a/src/patchelf.h
+++ b/src/patchelf.h
@@ -10,8 +10,8 @@
using FileContents = std::shared_ptr<std::vector<unsigned char>>;
-#define ElfFileParams class Elf_Ehdr, class Elf_Phdr, class Elf_Shdr, class Elf_Addr, class Elf_Off, class Elf_Dyn, class Elf_Sym, class Elf_Verneed, class Elf_Versym, class Elf_Rel, class Elf_Rela, unsigned ElfClass
-#define ElfFileParamNames Elf_Ehdr, Elf_Phdr, Elf_Shdr, Elf_Addr, Elf_Off, Elf_Dyn, Elf_Sym, Elf_Verneed, Elf_Versym, Elf_Rel, Elf_Rela, ElfClass
+#define ElfFileParams class Elf_Ehdr, class Elf_Phdr, class Elf_Shdr, class Elf_Addr, class Elf_Off, class Elf_Dyn, class Elf_Sym, class Elf_Versym, class Elf_Verdef, class Elf_Verdaux, class Elf_Verneed, class Elf_Vernaux, class Elf_Rel, class Elf_Rela, unsigned ElfClass
+#define ElfFileParamNames Elf_Ehdr, Elf_Phdr, Elf_Shdr, Elf_Addr, Elf_Off, Elf_Dyn, Elf_Sym, Elf_Versym, Elf_Verdef, Elf_Verdaux, Elf_Verneed, Elf_Vernaux, Elf_Rel, Elf_Rela, ElfClass
template<class T>
struct span
@@ -237,6 +237,40 @@ private:
}
}
+ template<class StrIdxCallback>
+ void forAllStringReferences(const Elf_Shdr& strTabHdr, StrIdxCallback&& fn);
+
+ template<class T, class U>
+ auto follow(U* ptr, size_t offset) -> T* {
+ return offset ? (T*)(((char*)ptr)+offset) : nullptr;
+ };
+
+ template<class VdFn, class VaFn>
+ void forAll_ElfVer(span<Elf_Verdef> vdspan, VdFn&& vdfn, VaFn&& vafn)
+ {
+ auto* vd = vdspan.begin();
+ for (; vd; vd = follow<Elf_Verdef>(vd, rdi(vd->vd_next)))
+ {
+ vdfn(*vd);
+ auto va = follow<Elf_Verdaux>(vd, rdi(vd->vd_aux));
+ for (; va; va = follow<Elf_Verdaux>(va, rdi(va->vda_next)))
+ vafn(*va);
+ }
+ }
+
+ template<class VnFn, class VaFn>
+ void forAll_ElfVer(span<Elf_Verneed> vnspan, VnFn&& vnfn, VaFn&& vafn)
+ {
+ auto* vn = vnspan.begin();
+ for (; vn; vn = follow<Elf_Verneed>(vn, rdi(vn->vn_next)))
+ {
+ vnfn(*vn);
+ auto va = follow<Elf_Vernaux>(vn, rdi(vn->vn_aux));
+ for (; va; va = follow<Elf_Vernaux>(va, rdi(va->vna_next)))
+ vafn(*va);
+ }
+ }
+
/* Convert an integer in big or little endian representation (as
specified by the ELF header) to this platform's integer
representation. */