| /* -*- 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 ); |
| |
| /* |
| * Values used in page table calculations |
| * |
| * On older versions of ld (without the SANE_EXPR feature), |
| * numeric literals within a section description tend to be |
| * interpreted as section-relative symbols. |
| * |
| */ |
| _page_size = 4096; |
| _page_size_1 = ( _page_size - 1 ); |
| _pte_size = 8; |
| _pte_count = ( _page_size / _pte_size ); |
| _pte_count_1 = ( _pte_count - 1 ); |
| |
| /* |
| * Allow decompressor to require a minimum amount of temporary stack |
| * space. |
| * |
| */ |
| PROVIDE ( _min_decompress_stack = 0 ); |
| |
| /* |
| * The prefix |
| * |
| */ |
| |
| .prefix 0x0 : AT ( _prefix_lma ) { |
| _prefix = .; |
| *(.prefix) |
| *(SORT(.pci_devlist.*)) |
| *(.prefix.*) |
| _mprefix = .; |
| } .bss.prefix (NOLOAD) : AT ( _bss_prefix_lma ) { |
| _eprefix = .; |
| } |
| _prefix_filesz = ABSOLUTE ( _mprefix ) - ABSOLUTE ( _prefix ); |
| _prefix_memsz = ABSOLUTE ( _eprefix ) - ABSOLUTE ( _prefix ); |
| _prefix_padsz = ABSOLUTE ( _eprefix ) - ABSOLUTE ( _mprefix ); |
| |
| /* |
| * 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 ( _bss_text16_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 ); |
| _text16_padsz = ABSOLUTE ( _etext16 ) - ABSOLUTE ( _mtext16 ); |
| |
| /* |
| * 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 ( _bss_data16_lma ) { |
| *(.bss16) |
| *(.bss16.*) |
| *(.stack16) |
| *(.stack16.*) |
| . = MAX ( ., _mdata16 + _min_decompress_stack ); |
| _edata16 = .; |
| } |
| _data16_filesz = ABSOLUTE ( _mdata16 ) - ABSOLUTE ( _data16 ); |
| _data16_memsz = ABSOLUTE ( _edata16 ) - ABSOLUTE ( _data16 ); |
| _data16_padsz = ABSOLUTE ( _edata16 ) - ABSOLUTE ( _mdata16 ); |
| |
| /* |
| * 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 ( _bss_textdata_lma ) { |
| *(.bss) |
| *(.bss.*) |
| *(COMMON) |
| *(.stack) |
| *(.stack.*) |
| _pages = .; |
| *(.pages) |
| *(.pages.*) |
| _use_page_tables = ABSOLUTE ( . ) - ABSOLUTE ( _pages ); |
| _textdata_paged_len = |
| ABSOLUTE ( ABSOLUTE ( . ) - ABSOLUTE ( _textdata ) ); |
| _textdata_ptes = |
| ABSOLUTE ( ( _textdata_paged_len + _page_size_1 ) / _page_size ); |
| _textdata_pdes = |
| ABSOLUTE ( ( _textdata_ptes + _pte_count_1 ) / _pte_count ); |
| . += ( _use_page_tables ? ( _textdata_pdes * _page_size ) : 0 ); |
| _epages = .; |
| _etextdata = .; |
| } |
| _textdata_filesz = ABSOLUTE ( _mtextdata ) - ABSOLUTE ( _textdata ); |
| _textdata_memsz = ABSOLUTE ( _etextdata ) - ABSOLUTE ( _textdata ); |
| _textdata_padsz = ABSOLUTE ( _etextdata ) - ABSOLUTE ( _mtextdata ); |
| |
| /* |
| * 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 ( _bss_pprefix_lma ) { |
| _epprefix = .; |
| } |
| _pprefix_filesz = ABSOLUTE ( _mpprefix ) - ABSOLUTE ( _pprefix ); |
| _pprefix_memsz = ABSOLUTE ( _epprefix ) - ABSOLUTE ( _pprefix ); |
| _pprefix_padsz = ABSOLUTE ( _epprefix ) - ABSOLUTE ( _mpprefix ); |
| |
| /* |
| * Compressor information block |
| * |
| */ |
| |
| .zinfo 0x0 : AT ( _zinfo_lma ) { |
| _zinfo = .; |
| KEEP(*(.zinfo)) |
| KEEP(*(.zinfo.*)) |
| _mzinfo = .; |
| } .bss.zinfo (NOLOAD) : AT ( _bss_zinfo_lma ) { |
| _ezinfo = .; |
| } |
| _zinfo_filesz = ABSOLUTE ( _mzinfo ) - ABSOLUTE ( _zinfo ); |
| _zinfo_memsz = ABSOLUTE ( _ezinfo ) - ABSOLUTE ( _zinfo ); |
| _zinfo_padsz = ABSOLUTE ( _ezinfo ) - ABSOLUTE ( _mzinfo ); |
| |
| /* |
| * 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.*) |
| *(.sbat) |
| *(.sbat.*) |
| } |
| |
| /* |
| * 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 = .; |
| . += ABSOLUTE ( _prefix_filesz ); |
| |
| . = ALIGN ( _max_align ); |
| _text16_early_lma = .; |
| . += ABSOLUTE ( _text16_early_filesz ); |
| |
| . = ALIGN ( _max_align ); |
| . = ALIGN ( _payload_align ); |
| _pprefix_lma = .; |
| . += ABSOLUTE ( _pprefix_filesz ); |
| |
| . = ALIGN ( _max_align ); |
| _payload_lma = .; |
| _pprefix_skip = ABSOLUTE ( _payload_lma ) - ABSOLUTE ( _pprefix_lma ); |
| _text16_late_lma = .; |
| . += ABSOLUTE ( _text16_late_filesz ); |
| |
| . = ALIGN ( _max_align ); |
| _data16_lma = .; |
| . += ABSOLUTE ( _data16_filesz ); |
| |
| . = ALIGN ( _max_align ); |
| _textdata_lma = .; |
| . += ABSOLUTE ( _textdata_filesz ); |
| |
| _filesz = .; /* Do not include .bss.* or .zinfo in file size */ |
| |
| /* |
| * Dummy load addresses for .bss.* and .zinfo sections |
| * |
| */ |
| |
| . = ALIGN ( _max_align ); |
| _bss_prefix_lma = .; |
| . += ABSOLUTE ( _prefix_padsz ); |
| |
| . = ALIGN ( _max_align ); |
| _bss_text16_lma = .; |
| . += ABSOLUTE ( _text16_padsz ); |
| |
| . = ALIGN ( _max_align ); |
| _bss_data16_lma = .; |
| . += ABSOLUTE ( _data16_padsz ); |
| |
| . = ALIGN ( _max_align ); |
| _bss_textdata_lma = .; |
| . += ABSOLUTE ( _textdata_padsz ); |
| |
| . = ALIGN ( _max_align ); |
| _bss_pprefix_lma = .; |
| . += ABSOLUTE ( _pprefix_padsz ); |
| |
| . = ALIGN ( _max_align ); |
| _bss_zinfo_lma = .; |
| . += ABSOLUTE ( _zinfo_padsz ); |
| |
| . = ALIGN ( _max_align ); |
| _zinfo_lma = .; |
| . += ABSOLUTE ( _zinfo_filesz ); |
| |
| . = ALIGN ( _max_align ); |
| _end_lma = .; |
| |
| /* |
| * Values calculated to save code from doing it |
| * |
| */ |
| _text16_memsz_ppgh = ( ( ( _text16_memsz + 63 ) / 64 ) * 4 ); |
| _data16_memsz_ppgh = ( ( ( _data16_memsz + 63 ) / 64 ) * 4 ); |
| _textdata_memsz_pgh = ( ( _textdata_memsz + 15 ) / 16 ); |
| _textdata_memsz_kb = ( ( _textdata_memsz + 1023 ) / 1024 ); |
| } |