summaryrefslogtreecommitdiff
path: root/src/model/fromFile.c
diff options
context:
space:
mode:
authornorly <ny-git@enpas.org>2013-05-27 17:21:52 +0100
committernorly <ny-git@enpas.org>2013-05-27 17:21:52 +0100
commit72a9d0790ae84475f5415444c3031b15ebf25dd4 (patch)
tree8d63755ac44bb8554bbd2ec7732a88616ed91bd0 /src/model/fromFile.c
parenta4d5efde2813be325bb01deac01efa773659edc2 (diff)
Find PHDR -> PHDR dependencies
Diffstat (limited to 'src/model/fromFile.c')
-rw-r--r--src/model/fromFile.c29
1 files changed, 27 insertions, 2 deletions
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);
}
}