root/arch/x86/boot/compressed/vmlinux.lds.S
/* SPDX-License-Identifier: GPL-2.0 */
#include <asm-generic/vmlinux.lds.h>

OUTPUT_FORMAT(CONFIG_OUTPUT_FORMAT)

#undef i386

#include <asm/cache.h>
#include <asm/page_types.h>

#ifdef CONFIG_X86_64
OUTPUT_ARCH(i386:x86-64)
ENTRY(startup_64)
#else
OUTPUT_ARCH(i386)
ENTRY(startup_32)
#endif

SECTIONS
{
        /* Be careful parts of head_64.S assume startup_32 is at
         * address 0.
         */
        . = 0;
        .head.text : {
                _head = . ;
                HEAD_TEXT
                _ehead = . ;
        }
        .rodata..compressed : {
                *(.rodata..compressed)
        }
        .text : {
                _text = .;      /* Text */
                *(.text)
                *(.text.*)
                *(.noinstr.text)
                _etext = . ;
        }
        .rodata : {
                _rodata = . ;
                *(.rodata)       /* read-only data */
                *(.rodata.*)
                _erodata = . ;
        }
#ifdef CONFIG_EFI_SBAT
        .sbat : ALIGN(0x1000) {
                _sbat = . ;
                *(.sbat)
                _esbat = ALIGN(0x1000);
                . = _esbat;
        }
#endif
        .data : ALIGN(0x1000) {
                _data = . ;
                *(.data)
                *(.data.*)

                /* Add 4 bytes of extra space for the obsolete CRC-32 checksum */
                . = ALIGN(. + 4, 0x200);
                _edata = . ;
        }
        . = ALIGN(L1_CACHE_BYTES);
        .bss : {
                _bss = . ;
                *(.bss)
                *(.bss.*)
                *(COMMON)
                . = ALIGN(8);   /* For convenience during zeroing */
                _ebss = .;
        }
#ifdef CONFIG_X86_64
       . = ALIGN(PAGE_SIZE);
       .pgtable : {
                _pgtable = . ;
                *(.pgtable)
                _epgtable = . ;
        }
#endif
        . = ALIGN(PAGE_SIZE);   /* keep ZO size page aligned */
        _end = .;

        STABS_DEBUG
        DWARF_DEBUG
        ELF_DETAILS

        DISCARDS
        /DISCARD/ : {
                *(.dynamic) *(.dynsym) *(.dynstr) *(.dynbss)
                *(.hash) *(.gnu.hash)
                *(.note.*) *(.modinfo)
        }

        .got.plt (INFO) : {
                *(.got.plt)
        }
        ASSERT(SIZEOF(.got.plt) == 0 ||
#ifdef CONFIG_X86_64
               SIZEOF(.got.plt) == 0x18,
#else
               SIZEOF(.got.plt) == 0xc,
#endif
               "Unexpected GOT/PLT entries detected!")

        /*
         * Sections that should stay zero sized, which is safer to
         * explicitly check instead of blindly discarding.
         */
        .got : {
                *(.got)
        }
        ASSERT(SIZEOF(.got) == 0, "Unexpected GOT entries detected!")

        .plt : {
                *(.plt) *(.plt.*)
        }
        ASSERT(SIZEOF(.plt) == 0, "Unexpected run-time procedure linkages detected!")

        .rel.dyn : {
                *(.rel.*) *(.rel_*)
        }
        ASSERT(SIZEOF(.rel.dyn) == 0, "Unexpected run-time relocations (.rel) detected!")

        .rela.dyn : {
                *(.rela.*) *(.rela_*)
        }
        ASSERT(SIZEOF(.rela.dyn) == 0, "Unexpected run-time relocations (.rela) detected!")
}