blob: 964e854a678cf8db2be52b8f30eef6f46508c229 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
#include <stdlib.h>
#include <libelf.h>
#include <gelf.h>
#include <libelfu/libelfu.h>
/*
* Returns the first section that is contained in the segment and
* ends as close to its memory image of as possible (the "last"
* section in the segment).
*
* If no section fits, NULL is returned.
*/
Elf_Scn* elfu_lastSectionInSegment(Elf *e, GElf_Phdr *phdr)
{
Elf_Scn *last = NULL;
Elf_Scn *scn;
scn = elf_getscn(e, 1);
while (scn) {
if (elfu_segmentContainsSection(phdr, scn) == ELFU_TRUE) {
if (!last) {
last = scn;
} else {
GElf_Shdr shdrOld;
GElf_Shdr shdrNew;
if (gelf_getshdr(last, &shdrOld) != &shdrOld) {
continue;
}
if (gelf_getshdr(scn, &shdrNew) != &shdrNew) {
continue;
}
if (shdrNew.sh_offset + shdrNew.sh_size
> shdrOld.sh_offset + shdrOld.sh_size) {
// TODO: Check (leftover space in memory image) < (p_align)
last = scn;
}
}
}
scn = elf_nextscn(e, scn);
}
return last;
}
|