rtld: Parse own phdr and notes.

Reviewed by:	emaste
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Differential revision:	https://reviews.freebsd.org/D25319
This commit is contained in:
Konstantin Belousov 2020-06-18 23:06:05 +00:00
parent 049264c5cc
commit e0b322ae78
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=362346

View File

@ -2182,6 +2182,34 @@ process_z(Obj_Entry *root)
}
}
}
static void
parse_rtld_phdr(Obj_Entry *obj)
{
const Elf_Phdr *ph;
Elf_Addr note_start, note_end;
obj->stack_flags = PF_X | PF_R | PF_W;
for (ph = obj->phdr; (const char *)ph < (const char *)obj->phdr +
obj->phsize; ph++) {
switch (ph->p_type) {
case PT_GNU_STACK:
obj->stack_flags = ph->p_flags;
break;
case PT_GNU_RELRO:
obj->relro_page = obj->relocbase +
trunc_page(ph->p_vaddr);
obj->relro_size = round_page(ph->p_memsz);
break;
case PT_NOTE:
note_start = (Elf_Addr)obj->relocbase + ph->p_vaddr;
note_end = note_start + ph->p_filesz;
digest_notes(obj, note_start, note_end);
break;
}
}
}
/*
* Initialize the dynamic linker. The argument is the address at which
* the dynamic linker has been mapped into memory. The primary task of
@ -2251,6 +2279,8 @@ init_rtld(caddr_t mapbase, Elf_Auxinfo **aux_info)
/* Replace the path with a dynamically allocated copy. */
obj_rtld.path = xstrdup(ld_path_rtld);
parse_rtld_phdr(&obj_rtld);
r_debug.r_brk = r_debug_state;
r_debug.r_state = RT_CONSISTENT;
}