summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/libelfu/modeltypes.h6
-rw-r--r--src/model/fromFile.c29
2 files changed, 31 insertions, 4 deletions
diff --git a/include/libelfu/modeltypes.h b/include/libelfu/modeltypes.h
index 961f904..e8a9c01 100644
--- a/include/libelfu/modeltypes.h
+++ b/include/libelfu/modeltypes.h
@@ -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;
diff --git a/src/model/fromFile.c b/src/model/fromFile.c
index af54555..fd6aba0 100644
--- a/src/model/fromFile.c
+++ b/src/model/fromFile.c
@@ -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);
}
}