struct ElfuScn *linkptr;
struct ElfuScn *infoptr;
- CIRCLEQ_ENTRY(ElfuScn) elemPhdrToScn;
+ CIRCLEQ_ENTRY(ElfuScn) elemChildScn;
CIRCLEQ_ENTRY(ElfuScn) elem;
} 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;
mp->phdr = *phdr;
- CIRCLEQ_INIT(&mp->phdrToScnList);
+ CIRCLEQ_INIT(&mp->childScnList);
+ CIRCLEQ_INIT(&mp->childPhdrList);
return mp;
}
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));
ElfuPhdr *parent = parentPhdr(me, ms);
if (parent) {
- CIRCLEQ_INSERT_TAIL(&parent->phdrToScnList, ms, elemPhdrToScn);
+ CIRCLEQ_INSERT_TAIL(&parent->childScnList, ms, elemChildScn);
}
}