diff --git a/repos/base-linux/src/core/linux/target.mk b/repos/base-linux/src/core/linux/target.mk index cc6830d66..6543730a6 100644 --- a/repos/base-linux/src/core/linux/target.mk +++ b/repos/base-linux/src/core/linux/target.mk @@ -42,7 +42,7 @@ INC_DIR += $(REP_DIR)/src/core/include \ LD_TEXT_ADDR ?= 0x01000000 LD_SCRIPT_STATIC = $(BASE_DIR)/src/ld/genode.ld \ - $(call select_from_repositories,src/ld/stack_area.nostdlib.ld) + $(call select_from_repositories,src/ld/stack_area.ld) include $(GEN_CORE_DIR)/version.inc diff --git a/repos/base-linux/src/include/base/internal/stack_area.h b/repos/base-linux/src/include/base/internal/stack_area.h index a3d0e3f2a..767da7f14 100644 --- a/repos/base-linux/src/include/base/internal/stack_area.h +++ b/repos/base-linux/src/include/base/internal/stack_area.h @@ -31,7 +31,7 @@ namespace Genode { * Stack area base address * * Please update platform-specific files after changing these - * functions, e.g., 'base-linux/src/ld/stack_area.*.ld'. + * functions, e.g., 'base-linux/src/ld/stack_area.ld'. */ static addr_t stack_area_virtual_base() { return align_addr((addr_t)&_stack_area_start, 20); } diff --git a/repos/base-linux/src/ld/stack_area.nostdlib.ld b/repos/base-linux/src/ld/stack_area.ld similarity index 59% rename from repos/base-linux/src/ld/stack_area.nostdlib.ld rename to repos/base-linux/src/ld/stack_area.ld index e3e343b0b..18dcb4709 100644 --- a/repos/base-linux/src/ld/stack_area.nostdlib.ld +++ b/repos/base-linux/src/ld/stack_area.ld @@ -18,10 +18,17 @@ PHDRS SECTIONS { - . = 0x40000000; - _stack_area_start = .; /* - * Since Linux loads ldso page aligned, we align the stack area after + * The virtual gap between start of text segment (0x0) and stack area + * must be sufficiently large to hold either the entire dynamic linker (text + + * data) or core (0x1000000 + text + data). Note, core-linux includes 80 MiB + * core-local memory in the BSS. + */ + . = 0x8000000; /* 128 MiB */ + _stack_area_start = .; + + /* + * Since Linux loads ldso page-aligned, we align the stack area after * loading to a 1 MiB boundary, therefore we reserve one MiB more here. */ .stack_area : { . += 0x10100000; } : stack_area diff --git a/repos/base-linux/src/ld/stack_area.stdlib.ld b/repos/base-linux/src/ld/stack_area.stdlib.ld deleted file mode 100644 index 09c829b98..000000000 --- a/repos/base-linux/src/ld/stack_area.stdlib.ld +++ /dev/null @@ -1,19 +0,0 @@ -/* - * \brief Linux-specific linker script additions (STDLIB = yes) - * \author Christian Helmuth - * \date 2010-09-22 - */ - -/* - * Copyright (C) 2010-2017 Genode Labs GmbH - * - * This file is part of the Genode OS framework, which is distributed - * under the terms of the GNU Affero General Public License version 3. - */ - -SECTIONS -{ - . = 0x40000000; - _stack_area_start = .; - .stack_area : { . += 0x10000000; } -} diff --git a/repos/base/lib/mk/ld-platform.inc b/repos/base/lib/mk/ld-platform.inc index d46d7fdd3..0b3b179bf 100644 --- a/repos/base/lib/mk/ld-platform.inc +++ b/repos/base/lib/mk/ld-platform.inc @@ -27,7 +27,8 @@ symbol.map: $(BASE_DIR)/lib/symbols/ld ifneq ($(filter linux, $(SPECS)),) ENTRY_POINT = _start_initial_stack -LD_OPT += -T$(call select_from_repositories,src/ld/stack_area.nostdlib.ld) \ +LD_SCRIPT_SO = $(BASE_DIR)/src/ld/genode_rel.ld \ + -T$(call select_from_repositories,src/ld/stack_area.ld) \ ifneq ($(filter x86_32, $(SPECS)),) LD_OPT += -T$(DIR)/linux-32.ld diff --git a/repos/base/mk/prg.mk b/repos/base/mk/prg.mk index 9293ea2b6..9751d4f7f 100644 --- a/repos/base/mk/prg.mk +++ b/repos/base/mk/prg.mk @@ -63,7 +63,12 @@ CXX_LINK_OPT += $(CC_MARCH) # # Generic linker script for statically linked binaries # +ifneq ($(filter linux, $(SPECS)),) +LD_SCRIPT_STATIC ?= $(BASE_DIR)/src/ld/genode.ld \ + $(call select_from_repositories,src/ld/stack_area.ld) +else LD_SCRIPT_STATIC ?= $(BASE_DIR)/src/ld/genode.ld +endif include $(BASE_DIR)/mk/generic.mk include $(BASE_DIR)/mk/base-libs.mk