# Copyright Microsoft and CHERIoT Contributors.
# SPDX-License-Identifier: MIT

SECTIONS
{
	. = 0;
	.compartment_export_table : ALIGN(8)
	{
		# Space for the compartment's PCC and GDC
		. = . + 16;
		# The compartment error handler, if it is defined.
		# The linker will process this relocation now, so we need to make it a
		# delta.  The final layout will be the compartment import table
		# followed by the text segment.  There won't be any padding, because
		# the compartment import table is more strongly aligned than text.
		SHORT(DEFINED(compartment_error_handler) ? compartment_error_handler - __compartment_code_start + SIZEOF(.compartment_import_table) : 0xffff);
		# The stackless compartment error handler, if it is defined.
		SHORT(DEFINED(compartment_error_handler_stackless) ? compartment_error_handler_stackless - __compartment_code_start + SIZEOF(.compartment_import_table) : 0xffff);
		# Array of compartment exports
		*(.compartment_exports .compartment_exports.*);
	}
	# Lay out the compartment imports section.  This will end up on PCC.
	.compartment_import_table : ALIGN(8)
	{
		# Array of compartment imports.
		HIDDEN(__compartment_pcc_start = .);
		# The first import table entry is the compartment switcher.
		HIDDEN(.compartment_switcher = .);
		. = . + 8;
		*(.compartment_imports .compartment_imports.*);
	}
	# Lay out the code
	.text :
	{
		HIDDEN(__compartment_code_start = .);
		# If there is a compartment error handler, make sure that it is before
		# anything that can have linker relaxations so that its displacement
		# from __compartment_code_start is a constant.
		*(.compartment_error_handler_stackless));
		*(.compartment_error_handler);
		*(.text .text.*);
	}
	.init_array :
	{
		HIDDEN(__init_array_start = .);
		*(.init_array);
		HIDDEN(__init_array_end = .);
	}
	# Read-only data that will end up in the compartment's PCC.
	.rodata :
	{
		*(.rodata .rodata.*);
		*(.data.rel.ro .data.rel.ro.*);
	}
	# Lay out all of the globals.
	.data :
	{
		*(.data .data.*);
		*(.sdata .sdata.*);
	}
	# BSS remains in a separate section so that we can find it later.
	.bss :
	{
		*(.sbss .sbss.*);
		*(.bss .bss.*);
	}
	.sealed_objects :
	{
		*(.sealed_objects .sealed_objects.*);
	}
	# Throw some stuff away that we don't need.
	/DISCARD/ :
	{
		*(.comment);
	}
}
