Find PHDR -> PHDR dependencies
authornorly <ny-git@enpas.org>
Mon, 27 May 2013 16:21:52 +0000 (17:21 +0100)
committernorly <ny-git@enpas.org>
Mon, 27 May 2013 16:21:52 +0000 (17:21 +0100)
include/libelfu/modeltypes.h
src/model/fromFile.c

index 961f904def535f51ff152e46642bafad01004d4f..e8a9c015ee4f70fc7e3799dbc9771ea26b63c118 100644 (file)
@@ -15,7 +15,7 @@ typedef struct ElfuScn {
   struct ElfuScn *linkptr;
   struct ElfuScn *infoptr;
 
-  CIRCLEQ_ENTRY(ElfuScn) elemPhdrToScn;
+  CIRCLEQ_ENTRY(ElfuScn) elemChildScn;
   CIRCLEQ_ENTRY(ElfuScn) elem;
 } ElfuScn;
 
@@ -23,8 +23,10 @@ typedef struct ElfuScn {
 typedef struct ElfuPhdr {
   GElf_Phdr phdr;
 
-  CIRCLEQ_HEAD(PhdrToScnList, ElfuScn) phdrToScnList;
+  CIRCLEQ_HEAD(ChildScnList, ElfuScn) childScnList;
+  CIRCLEQ_HEAD(ChildPhdrList, ElfuPhdr) childPhdrList;
 
+  CIRCLEQ_ENTRY(ElfuPhdr) elemChildPhdr;
   CIRCLEQ_ENTRY(ElfuPhdr) elem;
 } ElfuPhdr;
 
index af54555917f77107c49c518f7665ba65ceb6a0e7..fd6aba0b83586f8810a5c8c73cbc0515a80d9b4e 100644 (file)
@@ -70,7 +70,8 @@ static ElfuPhdr* modelFromPhdr(GElf_Phdr *phdr)
 
   mp->phdr = *phdr;
 
-  CIRCLEQ_INIT(&mp->phdrToScnList);
+  CIRCLEQ_INIT(&mp->childScnList);
+  CIRCLEQ_INIT(&mp->childPhdrList);
 
   return mp;
 }
@@ -195,6 +196,30 @@ ElfuElf* elfu_mFromElf(Elf *e)
     CIRCLEQ_INSERT_TAIL(&me->phdrList, mp, elem);
   }
 
+  if (numPhdr > 0) {
+    ElfuPhdr *mp;
+
+    /* Find PHDR -> PHDR dependencies (needs sorted sections) */
+    CIRCLEQ_FOREACH(mp, &me->phdrList, elem) {
+      ElfuPhdr *mp2;
+
+      if (mp->phdr.p_type != PT_LOAD) {
+        continue;
+      }
+
+      CIRCLEQ_FOREACH(mp2, &me->phdrList, elem) {
+        if (mp2 == mp) {
+          continue;
+        }
+
+        if (mp->phdr.p_vaddr <= mp2->phdr.p_vaddr
+            && OFFS_END(mp2->phdr.p_vaddr, mp2->phdr.p_memsz) <= OFFS_END(mp->phdr.p_vaddr, mp->phdr.p_memsz)) {
+          CIRCLEQ_INSERT_TAIL(&mp->childPhdrList, mp2, elemChildPhdr);
+        }
+      }
+    }
+  }
+
 
   /* Load sections */
   assert(!elf_getshdrnum(e, &numShdr));
@@ -260,7 +285,7 @@ ElfuElf* elfu_mFromElf(Elf *e)
       ElfuPhdr *parent = parentPhdr(me, ms);
 
       if (parent) {
-        CIRCLEQ_INSERT_TAIL(&parent->phdrToScnList, ms, elemPhdrToScn);
+        CIRCLEQ_INSERT_TAIL(&parent->childScnList, ms, elemChildScn);
       }
     }