From 72a9d0790ae84475f5415444c3031b15ebf25dd4 Mon Sep 17 00:00:00 2001 From: norly Date: Mon, 27 May 2013 17:21:52 +0100 Subject: [PATCH] Find PHDR -> PHDR dependencies --- include/libelfu/modeltypes.h | 6 ++++-- src/model/fromFile.c | 29 +++++++++++++++++++++++++++-- 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); } } -- 2.30.2