summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authornorly <ny-git@enpas.org>2013-06-22 01:26:45 +0100
committernorly <ny-git@enpas.org>2013-06-24 01:21:14 +0100
commit605d8a0c062b080d984fe6f3634c1511c6b6f2e8 (patch)
tree47e8a1f1bda0adbf5e481b211a3c0c677b679288 /src
parenta5a7af50662f99f933f6e657a131f2ff0e3a358e (diff)
PHDR: Find lowest/highest addr/offs
Diffstat (limited to 'src')
-rw-r--r--src/libelfu/model/phdr.c49
1 files changed, 48 insertions, 1 deletions
diff --git a/src/libelfu/model/phdr.c b/src/libelfu/model/phdr.c
index d175362..9889f39 100644
--- a/src/libelfu/model/phdr.c
+++ b/src/libelfu/model/phdr.c
@@ -58,7 +58,7 @@ size_t elfu_mPhdrCount(ElfuElf *me)
-/* Finding */
+/* Finding by exact address/offset */
static void* subFindLoadByAddr(ElfuElf *me, ElfuPhdr *mp, void *aux1, void *aux2)
{
@@ -102,6 +102,53 @@ ElfuPhdr* elfu_mPhdrByOffset(ElfuElf *me, GElf_Off offset)
+/* Find lowest/highest address/offset */
+
+void elfu_mPhdrLoadLowestHighest(ElfuElf *me,
+ ElfuPhdr **lowestAddr, ElfuPhdr **highestAddr,
+ ElfuPhdr **lowestOffs, ElfuPhdr **highestOffsEnd)
+{
+ ElfuPhdr *mp;
+
+ assert(me);
+ assert(lowestAddr);
+ assert(highestAddr);
+ assert(lowestOffs);
+ assert(highestOffsEnd);
+
+ *lowestAddr = NULL;
+ *highestAddr = NULL;
+ *lowestOffs = NULL;
+ *highestOffsEnd = NULL;
+
+ /* Find first and last LOAD PHDRs.
+ * Don't compare p_memsz - segments don't overlap in memory. */
+ CIRCLEQ_FOREACH(mp, &me->phdrList, elem) {
+ if (mp->phdr.p_type != PT_LOAD) {
+ continue;
+ }
+ if (!*lowestAddr || mp->phdr.p_vaddr < (*lowestAddr)->phdr.p_vaddr) {
+ *lowestAddr = mp;
+ }
+ if (!*highestAddr || mp->phdr.p_vaddr > (*highestAddr)->phdr.p_vaddr) {
+ *highestAddr = mp;
+ }
+ if (!*lowestOffs || mp->phdr.p_offset < (*lowestOffs)->phdr.p_offset) {
+ *lowestOffs = mp;
+ }
+ if (!*highestOffsEnd
+ || (OFFS_END(mp->phdr.p_offset,
+ mp->phdr.p_filesz)
+ > OFFS_END((*highestOffsEnd)->phdr.p_offset,
+ (*highestOffsEnd)->phdr.p_filesz))) {
+ *highestOffsEnd = mp;
+ }
+ }
+}
+
+
+
+
/* Layout update */
void elfu_mPhdrUpdateChildOffsets(ElfuPhdr *mp)