mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-28 21:45:01 +08:00
11cd8a6483
If explicit relocation hints are used by the toolchain, -Wa,-mla-* options will be useless for the C code. So only use them for the !CONFIG_AS_HAS_EXPLICIT_RELOCS case. Replace "la" with "la.pcrel" in head.S to keep the semantic consistent with new and old toolchains for the low level startup code. For per-CPU variables, the "address" of the symbol is actually an offset from $r21. The value is near the loading address of main kernel image, but far from the loading address of modules. So we use model("extreme") attibute to tell the compiler that a PC-relative addressing with 32-bit offset is not sufficient for local per-CPU variables. The behavior with different assemblers and compilers are summarized in the following table: AS has CC has explicit relocs explicit relocs * Behavior ============================================================== No No Use la.* macros. No change from Linux 6.0. -------------------------------------------------------------- No Yes Disable explicit relocs. No change from Linux 6.0. -------------------------------------------------------------- Yes No Not supported. -------------------------------------------------------------- Yes Yes Enable explicit relocs. No -Wa,-mla* options used. ============================================================== *: We assume CC must have model attribute if it has explicit relocs. Both features are added in GCC 13 development cycle, so any GCC release >= 13 should be OK. Using early GCC 13 development snapshots may produce modules with unsupported relocations. Link: https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=f09482a Link: https://gcc.gnu.org/r13-1834 Link: https://gcc.gnu.org/r13-2199 Tested-by: WANG Xuerui <git@xen0n.name> Signed-off-by: Xi Ruoyao <xry111@xry111.site> Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
130 lines
2.1 KiB
ArmAsm
130 lines
2.1 KiB
ArmAsm
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#include <linux/sizes.h>
|
|
#include <asm/asm-offsets.h>
|
|
#include <asm/thread_info.h>
|
|
|
|
#define PAGE_SIZE _PAGE_SIZE
|
|
|
|
/*
|
|
* Put .bss..swapper_pg_dir as the first thing in .bss. This will
|
|
* ensure that it has .bss alignment (64K).
|
|
*/
|
|
#define BSS_FIRST_SECTIONS *(.bss..swapper_pg_dir)
|
|
|
|
#include <asm-generic/vmlinux.lds.h>
|
|
#include "image-vars.h"
|
|
|
|
/*
|
|
* Max avaliable Page Size is 64K, so we set SectionAlignment
|
|
* field of EFI application to 64K.
|
|
*/
|
|
PECOFF_FILE_ALIGN = 0x200;
|
|
PECOFF_SEGMENT_ALIGN = 0x10000;
|
|
|
|
OUTPUT_ARCH(loongarch)
|
|
ENTRY(kernel_entry)
|
|
PHDRS {
|
|
text PT_LOAD FLAGS(7); /* RWX */
|
|
note PT_NOTE FLAGS(4); /* R__ */
|
|
}
|
|
|
|
jiffies = jiffies_64;
|
|
|
|
SECTIONS
|
|
{
|
|
. = VMLINUX_LOAD_ADDRESS;
|
|
|
|
_text = .;
|
|
HEAD_TEXT_SECTION
|
|
|
|
. = ALIGN(PECOFF_SEGMENT_ALIGN);
|
|
_stext = .;
|
|
.text : {
|
|
TEXT_TEXT
|
|
SCHED_TEXT
|
|
CPUIDLE_TEXT
|
|
LOCK_TEXT
|
|
KPROBES_TEXT
|
|
IRQENTRY_TEXT
|
|
SOFTIRQENTRY_TEXT
|
|
*(.fixup)
|
|
*(.gnu.warning)
|
|
} :text = 0
|
|
. = ALIGN(PECOFF_SEGMENT_ALIGN);
|
|
_etext = .;
|
|
|
|
EXCEPTION_TABLE(16)
|
|
|
|
.got : ALIGN(16) { *(.got) }
|
|
.plt : ALIGN(16) { *(.plt) }
|
|
.got.plt : ALIGN(16) { *(.got.plt) }
|
|
|
|
. = ALIGN(PECOFF_SEGMENT_ALIGN);
|
|
__init_begin = .;
|
|
__inittext_begin = .;
|
|
|
|
INIT_TEXT_SECTION(PAGE_SIZE)
|
|
.exit.text : {
|
|
EXIT_TEXT
|
|
}
|
|
|
|
. = ALIGN(PECOFF_SEGMENT_ALIGN);
|
|
__inittext_end = .;
|
|
|
|
__initdata_begin = .;
|
|
|
|
INIT_DATA_SECTION(16)
|
|
.exit.data : {
|
|
EXIT_DATA
|
|
}
|
|
|
|
#ifdef CONFIG_SMP
|
|
PERCPU_SECTION(1 << CONFIG_L1_CACHE_SHIFT)
|
|
#endif
|
|
|
|
.rela.dyn : ALIGN(8) { *(.rela.dyn) *(.rela*) }
|
|
|
|
.init.bss : {
|
|
*(.init.bss)
|
|
}
|
|
. = ALIGN(PECOFF_SEGMENT_ALIGN);
|
|
__initdata_end = .;
|
|
|
|
__init_end = .;
|
|
|
|
_sdata = .;
|
|
RO_DATA(4096)
|
|
RW_DATA(1 << CONFIG_L1_CACHE_SHIFT, PAGE_SIZE, THREAD_SIZE)
|
|
|
|
.sdata : {
|
|
*(.sdata)
|
|
}
|
|
.edata_padding : { BYTE(0); . = ALIGN(PECOFF_FILE_ALIGN); }
|
|
_edata = .;
|
|
|
|
BSS_SECTION(0, SZ_64K, 8)
|
|
. = ALIGN(PECOFF_SEGMENT_ALIGN);
|
|
|
|
_end = .;
|
|
|
|
STABS_DEBUG
|
|
DWARF_DEBUG
|
|
ELF_DETAILS
|
|
|
|
.gptab.sdata : {
|
|
*(.gptab.data)
|
|
*(.gptab.sdata)
|
|
}
|
|
.gptab.sbss : {
|
|
*(.gptab.bss)
|
|
*(.gptab.sbss)
|
|
}
|
|
|
|
DISCARDS
|
|
/DISCARD/ : {
|
|
*(.gnu.attributes)
|
|
*(.options)
|
|
*(.eh_frame)
|
|
}
|
|
}
|