PHDR: find by addr/offset
authornorly <ny-git@enpas.org>
Sat, 22 Jun 2013 00:00:38 +0000 (01:00 +0100)
committernorly <ny-git@enpas.org>
Sat, 22 Jun 2013 00:00:38 +0000 (01:00 +0100)
include/libelfu/modelops.h
src/libelfu/model/phdr.c

index 3a5d7ead82574db1380ecdefd9d9205f76bacb15..c6d5c30191f9e8760b6cf61cb13e88bac08fa24c 100644 (file)
@@ -21,6 +21,8 @@ void elfu_mRelocate(ElfuElf *metarget, ElfuScn *mstarget, ElfuScn *msrt);
 typedef void* (PhdrHandlerFunc)(ElfuElf *me, ElfuPhdr *mp, void *aux1, void *aux2);
     void* elfu_mPhdrForall(ElfuElf *me, PhdrHandlerFunc f, void *aux1, void *aux2);
    size_t elfu_mPhdrCount(ElfuElf *me);
+ElfuPhdr* elfu_mPhdrByAddr(ElfuElf *me, GElf_Addr addr);
+ElfuPhdr* elfu_mPhdrByOffset(ElfuElf *me, GElf_Off offset);
      void elfu_mPhdrUpdateChildOffsets(ElfuPhdr *mp);
 ElfuPhdr* elfu_mPhdrAlloc();
      void elfu_mPhdrDestroy(ElfuPhdr* mp);
index 1159fbb56c3988790c7d5c66544d778955294f2d..d175362d3dd272d6dd9c066598e65d7599e683cf 100644 (file)
@@ -44,7 +44,6 @@ static void* subCounter(ElfuElf *me, ElfuPhdr *mp, void *aux1, void *aux2)
   return NULL;
 }
 
-
 size_t elfu_mPhdrCount(ElfuElf *me)
 {
   size_t i = 0;
@@ -58,6 +57,51 @@ size_t elfu_mPhdrCount(ElfuElf *me)
 
 
 
+
+/* Finding */
+
+static void* subFindLoadByAddr(ElfuElf *me, ElfuPhdr *mp, void *aux1, void *aux2)
+{
+  GElf_Addr addr = *(GElf_Addr*)aux1;
+  (void)aux2;
+
+  if (mp->phdr.p_type == PT_LOAD
+      && FULLY_OVERLAPPING(mp->phdr.p_vaddr, mp->phdr.p_memsz, addr, 1)) {
+    return mp;
+  }
+
+  /* Continue */
+  return NULL;
+}
+
+ElfuPhdr* elfu_mPhdrByAddr(ElfuElf *me, GElf_Addr addr)
+{
+  return elfu_mPhdrForall(me, subFindLoadByAddr, &addr, NULL);
+}
+
+
+static void* subFindLoadByOffset(ElfuElf *me, ElfuPhdr *mp, void *aux1, void *aux2)
+{
+  GElf_Off offset = *(GElf_Off*)aux1;
+  (void)aux2;
+
+  if (mp->phdr.p_type == PT_LOAD
+      && FULLY_OVERLAPPING(mp->phdr.p_offset, mp->phdr.p_filesz, offset, 1)) {
+    return mp;
+  }
+
+  /* Continue */
+  return NULL;
+}
+
+ElfuPhdr* elfu_mPhdrByOffset(ElfuElf *me, GElf_Off offset)
+{
+  return elfu_mPhdrForall(me, subFindLoadByOffset, &offset, NULL);
+}
+
+
+
+
 /* Layout update */
 
 void elfu_mPhdrUpdateChildOffsets(ElfuPhdr *mp)