aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJessica Clarke <jrtc27@FreeBSD.org>2023-05-30 23:15:43 +0000
committerJessica Clarke <jrtc27@FreeBSD.org>2023-05-30 23:15:43 +0000
commit659a0041dd06355704f1bce0c5d7cbcb0b32c0a4 (patch)
tree9168f57273aaf55455c595b8e641e2ca357ca2b1
parent53d0b9e438bc30ef12c24fddec13e97ade852164 (diff)
downloadsrc-659a0041dd06355704f1bce0c5d7cbcb0b32c0a4.tar.gz
src-659a0041dd06355704f1bce0c5d7cbcb0b32c0a4.zip
imgact: Make et_dyn_addr part of image_params
This already gets passed around between various imgact_elf functions, so moving it removes an argument from all those places. A future commit will make use of this for hwpmc, though, to provide the load base for PIEs, which currently isn't available to tools like pmcstat. Reviewed by: kib, markj, jhb Differential Revision: https://reviews.freebsd.org/D39594
-rw-r--r--sys/kern/imgact_elf.c35
-rw-r--r--sys/sys/imgact.h1
2 files changed, 18 insertions, 18 deletions
diff --git a/sys/kern/imgact_elf.c b/sys/kern/imgact_elf.c
index e81810c33b33..35975af565fc 100644
--- a/sys/kern/imgact_elf.c
+++ b/sys/kern/imgact_elf.c
@@ -924,7 +924,7 @@ __CONCAT(rnd_, __elfN(base))(vm_map_t map, u_long minv, u_long maxv,
static int
__elfN(enforce_limits)(struct image_params *imgp, const Elf_Ehdr *hdr,
- const Elf_Phdr *phdr, u_long et_dyn_addr)
+ const Elf_Phdr *phdr)
{
struct vmspace *vmspace;
const char *err_str;
@@ -939,9 +939,9 @@ __elfN(enforce_limits)(struct image_params *imgp, const Elf_Ehdr *hdr,
if (phdr[i].p_type != PT_LOAD || phdr[i].p_memsz == 0)
continue;
- seg_addr = trunc_page(phdr[i].p_vaddr + et_dyn_addr);
+ seg_addr = trunc_page(phdr[i].p_vaddr + imgp->et_dyn_addr);
seg_size = round_page(phdr[i].p_memsz +
- phdr[i].p_vaddr + et_dyn_addr - seg_addr);
+ phdr[i].p_vaddr + imgp->et_dyn_addr - seg_addr);
/*
* Make the largest executable segment the official
@@ -1106,7 +1106,7 @@ __CONCAT(exec_, __elfN(imgact))(struct image_params *imgp)
char *interp;
Elf_Brandinfo *brand_info;
struct sysentvec *sv;
- u_long addr, baddr, et_dyn_addr, entry, proghdr;
+ u_long addr, baddr, entry, proghdr;
u_long maxalign, maxsalign, mapsz, maxv, maxv1, anon_loc;
uint32_t fctl0;
int32_t osrel;
@@ -1235,7 +1235,6 @@ __CONCAT(exec_, __elfN(imgact))(struct image_params *imgp)
goto ret;
}
sv = brand_info->sysvec;
- et_dyn_addr = 0;
if (hdr->e_type == ET_DYN) {
if ((brand_info->flags & BI_CAN_EXEC_DYN) == 0) {
uprintf("Cannot execute shared object\n");
@@ -1249,13 +1248,13 @@ __CONCAT(exec_, __elfN(imgact))(struct image_params *imgp)
if (baddr == 0) {
if ((sv->sv_flags & SV_ASLR) == 0 ||
(fctl0 & NT_FREEBSD_FCTL_ASLR_DISABLE) != 0)
- et_dyn_addr = __elfN(pie_base);
+ imgp->et_dyn_addr = __elfN(pie_base);
else if ((__elfN(pie_aslr_enabled) &&
(imgp->proc->p_flag2 & P2_ASLR_DISABLE) == 0) ||
(imgp->proc->p_flag2 & P2_ASLR_ENABLE) != 0)
- et_dyn_addr = ET_DYN_ADDR_RAND;
+ imgp->et_dyn_addr = ET_DYN_ADDR_RAND;
else
- et_dyn_addr = __elfN(pie_base);
+ imgp->et_dyn_addr = __elfN(pie_base);
}
}
@@ -1288,11 +1287,11 @@ __CONCAT(exec_, __elfN(imgact))(struct image_params *imgp)
if ((sv->sv_flags & SV_ASLR) == 0 ||
(imgp->proc->p_flag2 & P2_ASLR_DISABLE) != 0 ||
(fctl0 & NT_FREEBSD_FCTL_ASLR_DISABLE) != 0) {
- KASSERT(et_dyn_addr != ET_DYN_ADDR_RAND,
- ("et_dyn_addr == RAND and !ASLR"));
+ KASSERT(imgp->et_dyn_addr != ET_DYN_ADDR_RAND,
+ ("imgp->et_dyn_addr == RAND and !ASLR"));
} else if ((imgp->proc->p_flag2 & P2_ASLR_ENABLE) != 0 ||
(__elfN(aslr_enabled) && hdr->e_type == ET_EXEC) ||
- et_dyn_addr == ET_DYN_ADDR_RAND) {
+ imgp->et_dyn_addr == ET_DYN_ADDR_RAND) {
imgp->map_flags |= MAP_ASLR;
/*
* If user does not care about sbrk, utilize the bss
@@ -1329,24 +1328,24 @@ __CONCAT(exec_, __elfN(imgact))(struct image_params *imgp)
error = ENOEXEC;
}
- if (error == 0 && et_dyn_addr == ET_DYN_ADDR_RAND) {
+ if (error == 0 && imgp->et_dyn_addr == ET_DYN_ADDR_RAND) {
KASSERT((map->flags & MAP_ASLR) != 0,
("ET_DYN_ADDR_RAND but !MAP_ASLR"));
error = __CONCAT(rnd_, __elfN(base))(map,
vm_map_min(map) + mapsz + lim_max(td, RLIMIT_DATA),
/* reserve half of the address space to interpreter */
- maxv / 2, maxalign, &et_dyn_addr);
+ maxv / 2, maxalign, &imgp->et_dyn_addr);
}
vn_lock(imgp->vp, LK_SHARED | LK_RETRY);
if (error != 0)
goto ret;
- error = __elfN(load_sections)(imgp, hdr, phdr, et_dyn_addr, NULL);
+ error = __elfN(load_sections)(imgp, hdr, phdr, imgp->et_dyn_addr, NULL);
if (error != 0)
goto ret;
- error = __elfN(enforce_limits)(imgp, hdr, phdr, et_dyn_addr);
+ error = __elfN(enforce_limits)(imgp, hdr, phdr);
if (error != 0)
goto ret;
@@ -1370,7 +1369,7 @@ __CONCAT(exec_, __elfN(imgact))(struct image_params *imgp)
map->anon_loc = addr;
}
- entry = (u_long)hdr->e_entry + et_dyn_addr;
+ entry = (u_long)hdr->e_entry + imgp->et_dyn_addr;
imgp->entry_addr = entry;
if (interp != NULL) {
@@ -1389,7 +1388,7 @@ __CONCAT(exec_, __elfN(imgact))(struct image_params *imgp)
if (error != 0)
goto ret;
} else
- addr = et_dyn_addr;
+ addr = imgp->et_dyn_addr;
error = exec_map_stack(imgp);
if (error != 0)
@@ -1405,7 +1404,7 @@ __CONCAT(exec_, __elfN(imgact))(struct image_params *imgp)
vn_lock(imgp->vp, LK_SHARED | LK_RETRY);
}
elf_auxargs->execfd = -1;
- elf_auxargs->phdr = proghdr + et_dyn_addr;
+ elf_auxargs->phdr = proghdr + imgp->et_dyn_addr;
elf_auxargs->phent = hdr->e_phentsize;
elf_auxargs->phnum = hdr->e_phnum;
elf_auxargs->pagesz = PAGE_SIZE;
diff --git a/sys/sys/imgact.h b/sys/sys/imgact.h
index 963f53aa387b..7f3219a972fe 100644
--- a/sys/sys/imgact.h
+++ b/sys/sys/imgact.h
@@ -66,6 +66,7 @@ struct image_params {
const char *image_header; /* header of file to exec */
unsigned long entry_addr; /* entry address of target executable */
unsigned long reloc_base; /* load address of image */
+ unsigned long et_dyn_addr; /* PIE load base */
char *interpreter_name; /* name of the interpreter */
void *auxargs; /* ELF Auxinfo structure pointer */
struct sf_buf *firstpage; /* first page that we mapped */