diff --git a/ldso/dynlink.c b/ldso/dynlink.c index e4829c3a..3ecbddfa 100644 --- a/ldso/dynlink.c +++ b/ldso/dynlink.c @@ -609,6 +609,12 @@ static void *map_library(int fd, struct dso *dso) } else if (ph->p_type == PT_GNU_RELRO) { dso->relro_start = ph->p_vaddr & -PAGE_SIZE; dso->relro_end = (ph->p_vaddr + ph->p_memsz) & -PAGE_SIZE; + } else if (ph->p_type == PT_GNU_STACK) { + if (!runtime && ph->p_memsz > __default_stacksize) { + __default_stacksize = + ph->p_memsz < DEFAULT_STACK_MAX ? + ph->p_memsz : DEFAULT_STACK_MAX; + } } if (ph->p_type != PT_LOAD) continue; nsegs++; @@ -1238,6 +1244,12 @@ static void kernel_mapped_dso(struct dso *p) } else if (ph->p_type == PT_GNU_RELRO) { p->relro_start = ph->p_vaddr & -PAGE_SIZE; p->relro_end = (ph->p_vaddr + ph->p_memsz) & -PAGE_SIZE; + } else if (ph->p_type == PT_GNU_STACK) { + if (!runtime && ph->p_memsz > __default_stacksize) { + __default_stacksize = + ph->p_memsz < DEFAULT_STACK_MAX ? + ph->p_memsz : DEFAULT_STACK_MAX; + } } if (ph->p_type != PT_LOAD) continue; if (ph->p_vaddr < min_addr) diff --git a/src/env/__init_tls.c b/src/env/__init_tls.c index e0224243..96d0e284 100644 --- a/src/env/__init_tls.c +++ b/src/env/__init_tls.c @@ -90,6 +90,11 @@ static void static_init_tls(size_t *aux) base = (size_t)_DYNAMIC - phdr->p_vaddr; if (phdr->p_type == PT_TLS) tls_phdr = phdr; + if (phdr->p_type == PT_GNU_STACK && + phdr->p_memsz > __default_stacksize) + __default_stacksize = + phdr->p_memsz < DEFAULT_STACK_MAX ? + phdr->p_memsz : DEFAULT_STACK_MAX; } if (tls_phdr) {