diff options
| author | fishsoupisgood <github@madingley.org> | 2019-04-29 01:17:54 +0100 | 
|---|---|---|
| committer | fishsoupisgood <github@madingley.org> | 2019-05-27 03:43:43 +0100 | 
| commit | 3f2546b2ef55b661fd8dd69682b38992225e86f6 (patch) | |
| tree | 65ca85f13617aee1dce474596800950f266a456c /roms/ipxe/src/arch/i386/scripts | |
| download | qemu-master.tar.gz qemu-master.tar.bz2 qemu-master.zip | |
Diffstat (limited to 'roms/ipxe/src/arch/i386/scripts')
| -rw-r--r-- | roms/ipxe/src/arch/i386/scripts/i386-kir.lds | 202 | ||||
| -rw-r--r-- | roms/ipxe/src/arch/i386/scripts/i386.lds | 245 | ||||
| -rw-r--r-- | roms/ipxe/src/arch/i386/scripts/linux.lds | 104 | 
3 files changed, 551 insertions, 0 deletions
| diff --git a/roms/ipxe/src/arch/i386/scripts/i386-kir.lds b/roms/ipxe/src/arch/i386/scripts/i386-kir.lds new file mode 100644 index 00000000..66bf804e --- /dev/null +++ b/roms/ipxe/src/arch/i386/scripts/i386-kir.lds @@ -0,0 +1,202 @@ +/* -*- sh -*- */ + +/* + * Linker script for i386 images + * + */ + +OUTPUT_FORMAT ( "elf32-i386", "elf32-i386", "elf32-i386" ) +OUTPUT_ARCH ( i386 ) + +SECTIONS { + +    /* All sections in the resulting file have consecutive load +     * addresses, but may have individual link addresses depending on +     * the memory model being used. +     * +     * The linker symbols _prefix_link_addr, load_addr, and +     * _max_align may be specified explicitly.  If not specified, they +     * will default to: +     * +     *   _prefix_link_addr	= 0 +     *   _load_addr		= 0 +     *   _max_align		= 16 +     *  +     * We guarantee alignment of virtual addresses to any alignment +     * specified by the constituent object files (e.g. via +     * __attribute__((aligned(x)))).  Load addresses are guaranteed +     * only up to _max_align.  Provided that all loader and relocation +     * code honours _max_align, this means that physical addresses are +     * also guaranteed up to _max_align. +     * +     * Note that when using -DKEEP_IT_REAL, the UNDI segments are only +     * guaranteed to be loaded on a paragraph boundary (i.e. 16-byte +     * alignment).  Using _max_align>16 will therefore not guarantee +     * >16-byte alignment of physical addresses when -DKEEP_IT_REAL is +     * used (though virtual addresses will still be fully aligned). +     * +     */ + +    /* +     * The prefix +     */ + +    _prefix_link_addr = DEFINED ( _prefix_link_addr ) ? _prefix_link_addr : 0; +    . = _prefix_link_addr; +    _prefix = .; + +    .prefix : AT ( _prefix_load_offset + __prefix ) { +	__prefix = .; +	_entry = .; +	*(.prefix) +	*(.prefix.*) +	_eprefix_progbits = .; +    } +     +    _eprefix = .; + +    /* +     * The 16-bit sections +     */ + +    _text16_link_addr = 0; +    . = _text16_link_addr; +    _text16 = .; + +    . += 1;			/* Prevent NULL being valid */ + +    .text16 : AT ( _text16_load_offset + __text16 ) { +	__text16 = .; +	KEEP(*(.text.null_trap)) +	KEEP(*(.text.null_trap.*)) +	*(.text16) +	*(.text16.*) +	*(.text) +	*(.text.*) +	_etext16_progbits = .; +    } = 0x9090 + +    _etext16 = .; + +    _data16_link_addr = 0; +    . = _data16_link_addr; +    _data16 = .; + +    . += 1;			/* Prevent NULL being valid */ + +    .rodata16 : AT ( _data16_load_offset + __rodata16 ) { +	__rodata16 = .; +	*(.rodata16) +	*(.rodata16.*) +	*(.rodata) +	*(.rodata.*) +    } +    .data16 : AT ( _data16_load_offset + __data16 ) { +	__data16 = .; +	*(.data16) +	*(.data16.*) +	*(.data) +	*(.data.*) +	KEEP(*(SORT(.tbl.*)))	/* Various tables.  See include/tables.h */ +	KEEP(*(.provided)) +	KEEP(*(.provided.*)) +	_edata16_progbits = .; +    } +    .bss16 : AT ( _data16_load_offset + __bss16 ) { +	__bss16 = .; +	_bss16 = .; +	*(.bss16) +	*(.bss16.*) +	*(.bss) +	*(.bss.*) +	*(COMMON) +	_ebss16 = .; +    } +    .stack16 : AT ( _data16_load_offset + __stack16 ) { +	__stack16 = .; +	*(.stack16) +	*(.stack16.*) +	*(.stack) +	*(.stack.*) +    } + +    _edata16 = .; + +    _end = .; + +    /* +     * Dispose of the comment and note sections to make the link map +     * easier to read +     */ + +    /DISCARD/ : { +	*(.comment) +	*(.comment.*) +	*(.note) +	*(.note.*) +	*(.discard) +	*(.discard.*) +    } + +    /* +     * Load address calculations.  The slightly obscure nature of the +     * calculations is because ALIGN(x) can only operate on the +     * location counter. +     */ + +    _max_align		    = DEFINED ( _max_align ) ? _max_align : 16; +    _load_addr		    = DEFINED ( _load_addr ) ? _load_addr : 0; + +    .			    = _load_addr; + +    .			   -= _prefix_link_addr; +    _prefix_load_offset	    = ALIGN ( _max_align ); +    _prefix_load_addr	    = _prefix_link_addr + _prefix_load_offset; +    _prefix_size	    = _eprefix - _prefix; +    _prefix_progbits_size   = _eprefix_progbits - _prefix; +    .			    = _prefix_load_addr + _prefix_progbits_size; + +    .			   -= _text16_link_addr; +    _text16_load_offset	    = ALIGN ( _max_align ); +    _text16_load_addr	    = _text16_link_addr + _text16_load_offset; +    _text16_size	    = _etext16 - _text16; +    _text16_progbits_size   = _etext16_progbits - _text16; +    .			    = _text16_load_addr + _text16_progbits_size; + +    .			   -= _data16_link_addr; +    _data16_load_offset	    = ALIGN ( _max_align ); +    _data16_load_addr	    = _data16_link_addr + _data16_load_offset; +    _data16_size	    = _edata16 - _data16; +    _data16_progbits_size   = _edata16_progbits - _data16; +    .			    = _data16_load_addr + _data16_progbits_size; + +    .			    = ALIGN ( _max_align ); + +    _load_size		    = . - _load_addr; + +    /* +     * Alignment checks.  ALIGN() can only operate on the location +     * counter, so we set the location counter to each value we want +     * to check. +     */ + +    . = _prefix_load_addr - _prefix_link_addr; +    _assert = ASSERT ( ( . == ALIGN ( _max_align ) ), +		       "_prefix is badly aligned" ); + +    . = _text16_load_addr - _text16_link_addr; +    _assert = ASSERT ( ( . == ALIGN ( _max_align ) ), +		       "_text16 is badly aligned" ); + +    . = _data16_load_addr - _data16_link_addr; +    _assert = ASSERT ( ( . == ALIGN ( _max_align ) ), +		       "_data16 is badly aligned" ); + +    /* +     * Values calculated to save code from doing it +     */ +    _text16_size_pgh	= ( ( _text16_size + 15 ) / 16 ); +    _data16_size_pgh	= ( ( _data16_size + 15 ) / 16 ); +    _load_size_pgh	= ( ( _load_size + 15 ) / 16 ); +    _load_size_sect	= ( ( _load_size + 511 ) / 512 ); +} diff --git a/roms/ipxe/src/arch/i386/scripts/i386.lds b/roms/ipxe/src/arch/i386/scripts/i386.lds new file mode 100644 index 00000000..98f95cb2 --- /dev/null +++ b/roms/ipxe/src/arch/i386/scripts/i386.lds @@ -0,0 +1,245 @@ +/* -*- ld-script -*- */ + +/* + * Linker script for i386 images + * + */ + +SECTIONS { + +    /* Each section starts at a virtual address of zero. +     * +     * We guarantee alignment of virtual addresses to any alignment +     * specified by the constituent object files (e.g. via +     * __attribute__((aligned(x)))).  Load addresses are guaranteed +     * only up to _max_align.  Provided that all loader and relocation +     * code honours _max_align, this means that physical addresses are +     * also guaranteed up to _max_align. +     * +     * Note that when using -DKEEP_IT_REAL, the UNDI segments are only +     * guaranteed to be loaded on a paragraph boundary (i.e. 16-byte +     * alignment).  Using _max_align>16 will therefore not guarantee +     * >16-byte alignment of physical addresses when -DKEEP_IT_REAL is +     * used (though virtual addresses will still be fully aligned). +     * +     */ + +    PROVIDE ( _max_align = 16 ); + +    /* +     * The prefix +     * +     */ + +    .prefix 0x0 : AT ( _prefix_lma ) { +	_prefix = .; +	*(.prefix) +	*(.prefix.*) +	_mprefix = .; +    } .bss.prefix (NOLOAD) : AT ( _end_lma ) { +	_eprefix = .; +    } +    _prefix_filesz	= ABSOLUTE ( _mprefix ) - ABSOLUTE ( _prefix ); +    _prefix_memsz	= ABSOLUTE ( _eprefix ) - ABSOLUTE ( _prefix ); + +    /* +     * The 16-bit (real-mode) code section +     * +     */ + +    .text16.early 0x0 : AT ( _text16_early_lma ) { +	_text16 = .; +	KEEP(*(.text16.null)) +	KEEP(*(.text16.null.*)) +	. += 1;				/* Prevent NULL being valid */ +	*(.text16.early) +	*(.text16.early.*) +	_etext16_early = .; +    } .text16.late ALIGN ( _max_align ) : AT ( _text16_late_lma ) { +	_text16_late = .; +	*(.text16) +	*(.text16.*) +	_mtext16 = .; +    } .bss.text16 (NOLOAD) : AT ( _end_lma ) { +	_etext16 = .; +    } +    _text16_early_filesz = ABSOLUTE ( _etext16_early ) - ABSOLUTE ( _text16 ); +    _text16_early_memsz	= ABSOLUTE ( _etext16_early ) - ABSOLUTE ( _text16 ); +    _text16_late_filesz	= ABSOLUTE ( _mtext16 ) - ABSOLUTE ( _text16_late ); +    _text16_late_memsz	= ABSOLUTE ( _etext16 ) - ABSOLUTE ( _text16_late ); +    _text16_memsz	= ABSOLUTE ( _etext16 ) - ABSOLUTE ( _text16 ); + +    /* +     * The 16-bit (real-mode) data section +     * +     */ + +    .data16 0x0 : AT ( _data16_lma ) { +	_data16 = .; +	. += 1;				/* Prevent NULL being valid */ +	*(.rodata16) +	*(.rodata16.*) +	*(.data16) +	*(.data16.*) +	_mdata16 = .; +    } .bss.data16 (NOLOAD) : AT ( _end_lma ) { +	*(.bss16) +	*(.bss16.*) +	*(.stack16) +	*(.stack16.*) +	_edata16 = .; +    } +    _data16_filesz	= ABSOLUTE ( _mdata16 ) - ABSOLUTE ( _data16 ); +    _data16_memsz	= ABSOLUTE ( _edata16 ) - ABSOLUTE ( _data16 ); + +    /* +     * The 32-bit sections +     * +     */ + +    .textdata 0x0 : AT ( _textdata_lma ) { +	_textdata = .; +	KEEP(*(.text.null_trap)) +	KEEP(*(.text.null_trap.*)) +	. += 1;				/* Prevent NULL being valid */ +	*(.text) +	*(.text.*) +	*(.rodata) +	*(.rodata.*) +	*(.data) +	*(.data.*) +	KEEP(*(SORT(.tbl.*)))	/* Various tables.  See include/tables.h */ +	KEEP(*(.provided)) +	KEEP(*(.provided.*)) +	_mtextdata = .; +    } .bss.textdata (NOLOAD) : AT ( _end_lma ) { +	*(.bss) +	*(.bss.*) +	*(COMMON) +	*(.stack) +	*(.stack.*) +	_etextdata = .; +    } +    _textdata_filesz	= ABSOLUTE ( _mtextdata ) - ABSOLUTE ( _textdata ); +    _textdata_memsz	= ABSOLUTE ( _etextdata ) - ABSOLUTE ( _textdata ); + +    /* +     * Payload prefix +     * +     * If present, this will be placed between .text16.early and .text16.late. +     * +     */ +    .pprefix 0x0 : AT ( _pprefix_lma ) { +	_pprefix = .; +	KEEP(*(.pprefix)) +	KEEP(*(.pprefix.*)) +	_mpprefix = .; +    } .bss.pprefix (NOLOAD) : AT ( _end_lma ) { +	_epprefix = .; +    } +    _pprefix_filesz	= ABSOLUTE ( _mpprefix ) - ABSOLUTE ( _pprefix ); +    _pprefix_memsz	= ABSOLUTE ( _epprefix ) - ABSOLUTE ( _pprefix ); + +    /* +     * Compressor information block +     * +     */ + +    .zinfo 0x0 : AT ( _zinfo_lma ) { +	_zinfo = .; +	KEEP(*(.zinfo)) +	KEEP(*(.zinfo.*)) +	_mzinfo = .; +    } .bss.zinfo (NOLOAD) : AT ( _end_lma ) { +	_ezinfo = .; +    } +    _zinfo_filesz	= ABSOLUTE ( _mzinfo ) - ABSOLUTE ( _zinfo ); +    _zinfo_memsz	= ABSOLUTE ( _ezinfo ) - ABSOLUTE ( _zinfo ); + +    /* +     * Weak symbols that need zero values if not otherwise defined +     * +     */ + +    .weak 0x0 : AT ( _end_lma ) { +	_weak = .; +	*(.weak) +	*(.weak.*) +	_eweak = .; +    } +    _assert = ASSERT ( ( _weak == _eweak ), ".weak is non-zero length" ); + +    /* +     * Dispose of the comment and note sections to make the link map +     * easier to read +     * +     */ + +    /DISCARD/ : { +	*(.comment) +	*(.comment.*) +	*(.note) +	*(.note.*) +	*(.eh_frame) +	*(.eh_frame.*) +	*(.rel) +	*(.rel.*) +	*(.einfo) +	*(.einfo.*) +	*(.discard) +	*(.discard.*) +    } + +    /* +     * Load address calculations.  In older versions of ld, ALIGN() +     * can operate only on the location counter, so we use that. +     * +     */ + +    .			= 0; + +    .			= ALIGN ( _max_align ); +    _prefix_lma		= .; +    .			+= _prefix_filesz; + +    .			= ALIGN ( _max_align ); +    _text16_early_lma	= .; +    .			+= _text16_early_filesz; + +    .			= ALIGN ( _max_align ); +    .			= ALIGN ( _payload_align ); +    _pprefix_lma	= .; +    .			+= _pprefix_filesz; + +    .			= ALIGN ( _max_align ); +    _payload_lma	= .; +    _pprefix_skip	= ABSOLUTE ( _payload_lma ) - ABSOLUTE ( _pprefix_lma ); +    _text16_late_lma	= .; +    .			+= _text16_late_filesz; + +    .			= ALIGN ( _max_align ); +    _data16_lma		= .; +    .			+= _data16_filesz; + +    .			= ALIGN ( _max_align ); +    _textdata_lma	= .; +    .			+= _textdata_filesz; + +    _filesz		= .; /* Do not include zinfo block in file size */ + +    .			= ALIGN ( _max_align ); +    _zinfo_lma		= .; +    .			+= _zinfo_filesz; + +    .			= ALIGN ( _max_align ); +    _end_lma		= .; + +    /* +     * Values calculated to save code from doing it +     * +     */ +    _text16_memsz_pgh	= ( ( _text16_memsz + 15 ) / 16 ); +    _data16_memsz_pgh	= ( ( _data16_memsz + 15 ) / 16 ); +    _textdata_memsz_pgh	= ( ( _textdata_memsz + 15 ) / 16 ); +    _textdata_memsz_kb	= ( ( _textdata_memsz + 1023 ) / 1024 ); +} diff --git a/roms/ipxe/src/arch/i386/scripts/linux.lds b/roms/ipxe/src/arch/i386/scripts/linux.lds new file mode 100644 index 00000000..9f2eeaf3 --- /dev/null +++ b/roms/ipxe/src/arch/i386/scripts/linux.lds @@ -0,0 +1,104 @@ +/* -*- sh -*- */ + +/* + * Linker script for i386 Linux images + * + */ + +OUTPUT_FORMAT ( "elf32-i386", "elf32-i386", "elf32-i386" ) +OUTPUT_ARCH ( i386 ) + +SECTIONS { +	_max_align = 32; + +	. = 0x08048000; + +	/* +	 * The text section +	 * +	 */ + +	. = ALIGN ( _max_align ); +	.text : { +		_text = .; +		*(.text) +		*(.text.*) +		_etext = .; +	} + +	/* +	 * The rodata section +	 * +	 */ + +	. = ALIGN ( _max_align ); +	.rodata : { +		_rodata = .; +		*(.rodata) +		*(.rodata.*) +		_erodata = .; +	} + +	/* +	 * The data section +	 * +	 * Adjust the address for the data segment.  We want to adjust up to +	 * the same address within the page on the next page up. +	 */ + +	. = ALIGN (CONSTANT (MAXPAGESIZE)) - ((CONSTANT (MAXPAGESIZE) - .) & (CONSTANT (MAXPAGESIZE) - 1)); +	. = DATA_SEGMENT_ALIGN (CONSTANT (MAXPAGESIZE), CONSTANT (COMMONPAGESIZE)); +	.data : { +		_data = .; +		*(.data) +		*(.data.*) +		KEEP(*(SORT(.tbl.*))) +		KEEP(*(.provided)) +		KEEP(*(.provided.*)) +		_edata = .; +	} + +	/* +	 * The bss section +	 * +	 */ + +	. = ALIGN ( _max_align ); +	.bss : { +		_bss = .; +		*(.bss) +		*(.bss.*) +		*(COMMON) +		_ebss = .; +	} + +	/* +	 * Weak symbols that need zero values if not otherwise defined +	 * +	 */ + +	.weak 0x0 : { +		_weak = .; +		*(.weak) +		*(.weak.*) +		_eweak = .; +	} +	_assert = ASSERT ( ( _weak == _eweak ), ".weak is non-zero length" ); + +	/* +	 * Dispose of the comment and note sections to make the link map +	 * easier to read +	 * +	 */ + +	/DISCARD/ : { +		*(.comment) +		*(.comment.*) +		*(.note) +		*(.note.*) +		*(.rel) +		*(.rel.*) +		*(.discard) +		*(.discard.*) +	} +} | 
