diff options
author | dfr <dfr@FreeBSD.org> | 2004-08-08 09:48:10 +0000 |
---|---|---|
committer | dfr <dfr@FreeBSD.org> | 2004-08-08 09:48:10 +0000 |
commit | 6a047f3d1e10a3a656f093b57450980b6abd4f1f (patch) | |
tree | 6bea4af7ac0af9dcc73f2688bc67e395bd1cd702 /sys/kern | |
parent | f93065ec3e993ed2b0596d0a4720931adcbc31b2 (diff) | |
download | FreeBSD-src-6a047f3d1e10a3a656f093b57450980b6abd4f1f.zip FreeBSD-src-6a047f3d1e10a3a656f093b57450980b6abd4f1f.tar.gz |
Make sure that AT_PHDR has a useful value even for static programs.
Diffstat (limited to 'sys/kern')
-rw-r--r-- | sys/kern/imgact_elf.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/sys/kern/imgact_elf.c b/sys/kern/imgact_elf.c index 1c73b62..04b88d4 100644 --- a/sys/kern/imgact_elf.c +++ b/sys/kern/imgact_elf.c @@ -736,6 +736,17 @@ __CONCAT(exec_, __elfN(imgact))(struct image_params *imgp) sv->sv_pagesize)) != 0) goto fail; + /* + * If this segment contains the program headers, + * remember their virtual address for the AT_PHDR + * aux entry. Static binaries don't usually include + * a PT_PHDR entry. + */ + if (phdr[i].p_offset == 0 && + hdr->e_phoff + hdr->e_phnum * hdr->e_phentsize + <= phdr[i].p_filesz) + proghdr = phdr[i].p_vaddr + hdr->e_phoff; + seg_addr = trunc_page(phdr[i].p_vaddr); seg_size = round_page(phdr[i].p_memsz + phdr[i].p_vaddr - seg_addr); |