summaryrefslogtreecommitdiffstats
path: root/sys/kern
diff options
context:
space:
mode:
authordfr <dfr@FreeBSD.org>2004-08-08 09:48:10 +0000
committerdfr <dfr@FreeBSD.org>2004-08-08 09:48:10 +0000
commit6a047f3d1e10a3a656f093b57450980b6abd4f1f (patch)
tree6bea4af7ac0af9dcc73f2688bc67e395bd1cd702 /sys/kern
parentf93065ec3e993ed2b0596d0a4720931adcbc31b2 (diff)
downloadFreeBSD-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.c11
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);
OpenPOWER on IntegriCloud