diff options
Diffstat (limited to '')
-rw-r--r-- | mld/seg.c | 23 |
1 files changed, 21 insertions, 2 deletions
@@ -82,6 +82,13 @@ static int load_reltab(struct object *obj, struct segment *seg) if (type != SHT_REL && type != SHT_RELA) continue; + if ((type == SHT_REL && B32(hdr->sh_entsize) != + sizeof(Elf32_Rel)) || (type == SHT_RELA && + B32(hdr->sh_entsize) != sizeof(Elf32_Rela))) { + ERROR("reltab [%d] has invalid entry size", i); + return M_ERROR; + } + if (B32(hdr->sh_info) != seg->shdr_idx) continue; @@ -101,9 +108,8 @@ static int load_reltab(struct object *obj, struct segment *seg) uint32_t len = B32(hdr->sh_size); uint32_t off = B32(hdr->sh_offset); - seg->reltab.symtab = symtab; - seg->reltab.len = len; + seg->reltab.len = len / B32(hdr->sh_entsize); seg->reltab.raw = obj->mapped + off; seg->reltab.type = type; @@ -131,5 +137,18 @@ int segment_load(struct object *obj, struct segment *seg, size_t index) if (load_reltab(obj, seg)) return M_ERROR; + seg->off = B32(seg->phdr->p_offset); + seg->vaddr = B32(seg->phdr->p_vaddr); + seg->size = B32(seg->phdr->p_filesz); + seg->new_off = 0; + seg->new_vaddr = 0; + + seg->read = B32(seg->phdr->p_flags) & PF_R; + seg->write = B32(seg->phdr->p_flags) & PF_W; + seg->execute = B32(seg->phdr->p_flags) & PF_X; + seg->align = B32(seg->phdr->p_align); + + seg->obj = obj; + return M_SUCCESS; } |