The input file format is composed by two required top-level attributes, the
settings attribute and the segments
attribute. Other optional top-level attributes may be specified, like
vram_classes or symbol_assignments.
Check their specific documents for in-deep explanations.
The document is composed by the following top-level attributes:
settings.- A list of
vram_classes. - A list of
segments.- This list is required.
entry- A single optional string that specifies the entrypoint of the final build.
- A list of
symbol_assignments. - A list of
required_symbols. - A list of
asserts
The following example corresponds to the
basic_example.yaml from the test
cases, while
basic_example.ld is how the output
linker script looks like.
settings:
base_path: build
subalign: 32
segments:
- name: header
files:
- { path: asm/data/rom_header.o }
- name: ipl3
files:
- { path: asm/data/ipl3.o }
- name: entry
fixed_vram: 0x80000400
files:
- { path: asm/entry.o }
- name: boot
subalign: null
files:
- { path: src/boot/boot_main.o }
- { path: src/boot/dmadata.o }
- { path: asm/util.o }This example lists 4 segments.
The header segment is composed by only one file, rom_header.o. The full
path for every file is computed by joining the base_path (from settings)
with the file's path, meaining the full path of this file is
build/asm/data/rom_header.o. By default base_path is an empty string.
The entry segment is the first segment to specify a fixed vram address.
This will force this segment to be put at this specific address.
Since the boot segment does not specify a fixed vram address then its
address will be the end vram address of the previous segment (entry).
The boot segment specified subalign to be null, so a SUBALIGN directive
should not be used for this segment. This means sections from every file will
be aligned using the alignment from the elf files.
The same sections of each file are put together in the order specified by the
settings. Since no order was specified in this example then the default order
and sections are used.
For every listed segment there will be emitted two segments. One for the
allocatable sections (which has the same name of the segment with a . prefix)
and another for the noload (a.k.a. bss and family) sections (with the name
of the segment with a . prefix and .noload suffix).
The section listing for the .boot segment would look like the following:
build/src/boot/boot_main.o(.text*)
build/src/boot/dmadata.o(.text*)
build/asm/util.o(.text*)
build/src/boot/boot_main.o(.data*)
build/src/boot/dmadata.o(.data*)
build/asm/util.o(.data*)
build/src/boot/boot_main.o(.rodata*)
build/src/boot/dmadata.o(.rodata*)
build/asm/util.o(.rodata*)
build/src/boot/boot_main.o(.sdata*)
build/src/boot/dmadata.o(.sdata*)
build/asm/util.o(.sdata*)The section listing for the .boot.noload segment would look like this:
build/src/boot/boot_main.o(.sbss*)
build/src/boot/dmadata.o(.sbss*)
build/asm/util.o(.sbss*)
build/src/boot/boot_main.o(.scommon*)
build/src/boot/dmadata.o(.scommon*)
build/asm/util.o(.scommon*)
build/src/boot/boot_main.o(.bss*)
build/src/boot/dmadata.o(.bss*)
build/asm/util.o(.bss*)
build/src/boot/boot_main.o(COMMON*)
build/src/boot/dmadata.o(COMMON*)
build/asm/util.o(COMMON*)