mirror of
https://github.com/raspberrypi/linux.git
synced 2026-01-04 18:27:36 +00:00
Naresh reported this build error on linux-next: s390x-linux-gnu-ld: Unexpected GOT/PLT entries detected! make[3]: *** [/builds/linux/arch/s390/boot/Makefile:87: arch/s390/boot/vmlinux.syms] Error 1 make[3]: Target 'arch/s390/boot/bzImage' not remade because of errors. The reason for the build error is an incorrect/incomplete assertion which checks the size of the .got.plt section. Similar to x86 the size is either zero or 24 bytes (three entries). See commit262b5cae67("x86/boot/compressed: Move .got.plt entries out of the .got section") for more details. The three reserved/additional entries for s390 are described in chapter 3.2.2 of the s390x ABI [1] (thanks to Andreas Krebbel for pointing this out!). [1] https://github.com/IBM/s390x-abi/releases/download/v1.6.1/lzsabi_s390x.pdf Reported-by: Naresh Kamboju <naresh.kamboju@linaro.org> Reported-by: Linux Kernel Functional Testing <lkft@linaro.org> Closes: https://lore.kernel.org/all/CA+G9fYvWp8TY-fMEvc3UhoVtoR_eM5VsfHj3+n+kexcfJJ+Cvw@mail.gmail.com Fixes:30226853d6("s390: vmlinux.lds.S: explicitly handle '.got' and '.plt' sections") Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
177 lines
3.6 KiB
ArmAsm
177 lines
3.6 KiB
ArmAsm
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#include <asm-generic/vmlinux.lds.h>
|
|
#include <asm/vmlinux.lds.h>
|
|
#include <asm/thread_info.h>
|
|
#include <asm/page.h>
|
|
#include <asm/sclp.h>
|
|
#include "boot.h"
|
|
|
|
OUTPUT_FORMAT("elf64-s390", "elf64-s390", "elf64-s390")
|
|
OUTPUT_ARCH(s390:64-bit)
|
|
|
|
ENTRY(startup)
|
|
|
|
SECTIONS
|
|
{
|
|
. = 0;
|
|
.ipldata : {
|
|
*(.ipldata)
|
|
}
|
|
. = IPL_START;
|
|
.head.text : {
|
|
_head = . ;
|
|
HEAD_TEXT
|
|
_ehead = . ;
|
|
}
|
|
. = PARMAREA;
|
|
.parmarea : {
|
|
*(.parmarea)
|
|
}
|
|
.text : {
|
|
_text = .; /* Text */
|
|
*(.text)
|
|
*(.text.*)
|
|
INIT_TEXT
|
|
_etext = . ;
|
|
}
|
|
.rodata : {
|
|
_rodata = . ;
|
|
*(.rodata) /* read-only data */
|
|
*(.rodata.*)
|
|
_erodata = . ;
|
|
}
|
|
.got : {
|
|
*(.got)
|
|
}
|
|
NOTES
|
|
.data : {
|
|
_data = . ;
|
|
*(.data)
|
|
*(.data.*)
|
|
_edata = . ;
|
|
}
|
|
|
|
BOOT_DATA
|
|
BOOT_DATA_PRESERVED
|
|
|
|
/*
|
|
* This is the BSS section of the decompressor and not of the decompressed Linux kernel.
|
|
* It will consume place in the decompressor's image.
|
|
*/
|
|
. = ALIGN(8);
|
|
.bss : {
|
|
_bss = . ;
|
|
*(.bss)
|
|
*(.bss.*)
|
|
*(COMMON)
|
|
/*
|
|
* Stacks for the decompressor
|
|
*/
|
|
. = ALIGN(PAGE_SIZE);
|
|
_dump_info_stack_start = .;
|
|
. += PAGE_SIZE;
|
|
_dump_info_stack_end = .;
|
|
. = ALIGN(PAGE_SIZE);
|
|
_stack_start = .;
|
|
. += BOOT_STACK_SIZE;
|
|
_stack_end = .;
|
|
_ebss = .;
|
|
}
|
|
|
|
/*
|
|
* uncompressed image info used by the decompressor it should match
|
|
* struct vmlinux_info. It comes from .vmlinux.info section of
|
|
* uncompressed vmlinux in a form of info.o
|
|
*/
|
|
. = ALIGN(8);
|
|
.vmlinux.info : {
|
|
_vmlinux_info = .;
|
|
*(.vmlinux.info)
|
|
}
|
|
|
|
.decompressor.syms : {
|
|
. += 1; /* make sure we have \0 before the first entry */
|
|
. = ALIGN(2);
|
|
_decompressor_syms_start = .;
|
|
*(.decompressor.syms)
|
|
_decompressor_syms_end = .;
|
|
}
|
|
|
|
_decompressor_end = .;
|
|
|
|
#ifdef CONFIG_KERNEL_UNCOMPRESSED
|
|
. = 0x100000;
|
|
#else
|
|
. = ALIGN(8);
|
|
#endif
|
|
.rodata.compressed : {
|
|
_compressed_start = .;
|
|
*(.vmlinux.bin.compressed)
|
|
_compressed_end = .;
|
|
}
|
|
|
|
#ifndef CONFIG_PIE_BUILD
|
|
/*
|
|
* When the kernel is built with CONFIG_KERNEL_UNCOMPRESSED, the entire
|
|
* uncompressed vmlinux.bin is positioned in the bzImage decompressor
|
|
* image at the default kernel LMA of 0x100000, enabling it to be
|
|
* executed in-place. However, the size of .vmlinux.relocs could be
|
|
* large enough to cause an overlap with the uncompressed kernel at the
|
|
* address 0x100000. To address this issue, .vmlinux.relocs is
|
|
* positioned after the .rodata.compressed.
|
|
*/
|
|
. = ALIGN(4);
|
|
.vmlinux.relocs : {
|
|
__vmlinux_relocs_64_start = .;
|
|
*(.vmlinux.relocs_64)
|
|
__vmlinux_relocs_64_end = .;
|
|
}
|
|
#endif
|
|
|
|
#define SB_TRAILER_SIZE 32
|
|
/* Trailer needed for Secure Boot */
|
|
. += SB_TRAILER_SIZE; /* make sure .sb.trailer does not overwrite the previous section */
|
|
. = ALIGN(4096) - SB_TRAILER_SIZE;
|
|
.sb.trailer : {
|
|
QUAD(0)
|
|
QUAD(0)
|
|
QUAD(0)
|
|
QUAD(0x000000207a49504c)
|
|
}
|
|
_end = .;
|
|
|
|
DWARF_DEBUG
|
|
ELF_DETAILS
|
|
|
|
/*
|
|
* Make sure that the .got.plt is either completely empty or it
|
|
* contains only the three reserved double words.
|
|
*/
|
|
.got.plt : {
|
|
*(.got.plt)
|
|
}
|
|
ASSERT(SIZEOF(.got.plt) == 0 || SIZEOF(.got.plt) == 0x18, "Unexpected GOT/PLT entries detected!")
|
|
|
|
/*
|
|
* Sections that should stay zero sized, which is safer to
|
|
* explicitly check instead of blindly discarding.
|
|
*/
|
|
.plt : {
|
|
*(.plt) *(.plt.*) *(.iplt) *(.igot .igot.plt)
|
|
}
|
|
ASSERT(SIZEOF(.plt) == 0, "Unexpected run-time procedure linkages detected!")
|
|
.rela.dyn : {
|
|
*(.rela.*) *(.rela_*)
|
|
}
|
|
ASSERT(SIZEOF(.rela.dyn) == 0, "Unexpected run-time relocations (.rela) detected!")
|
|
|
|
/* Sections to be discarded */
|
|
/DISCARD/ : {
|
|
COMMON_DISCARDS
|
|
*(.eh_frame)
|
|
*(__ex_table)
|
|
*(*__ksymtab*)
|
|
*(___kcrctab*)
|
|
}
|
|
}
|