sparc64: fix alignment bug in linker definition script
The RO_DATA section were hardcoded to a specific alignment in include/asm-generic/vmlinux.h. But for sparc64 this did not match the PAGE_SIZE. Introduce a new section definition named: RO_DATA that takes actual alignment as parameter. RODATA are provided for backward compatibility. On top of this avoid hardcoding alignment for sparc64 in reset of the script Fix is build-tested on sparc64 + x86_64. Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
This commit is contained in:
Родитель
c420bc9f09
Коммит
4096b46f01
|
@ -1,5 +1,6 @@
|
||||||
/* ld script to make UltraLinux kernel */
|
/* ld script to make UltraLinux kernel */
|
||||||
|
|
||||||
|
#include <asm/page.h>
|
||||||
#include <asm-generic/vmlinux.lds.h>
|
#include <asm-generic/vmlinux.lds.h>
|
||||||
|
|
||||||
OUTPUT_FORMAT("elf64-sparc", "elf64-sparc", "elf64-sparc")
|
OUTPUT_FORMAT("elf64-sparc", "elf64-sparc", "elf64-sparc")
|
||||||
|
@ -23,7 +24,7 @@ SECTIONS
|
||||||
_etext = .;
|
_etext = .;
|
||||||
PROVIDE (etext = .);
|
PROVIDE (etext = .);
|
||||||
|
|
||||||
RODATA
|
RO_DATA(PAGE_SIZE)
|
||||||
|
|
||||||
.data :
|
.data :
|
||||||
{
|
{
|
||||||
|
@ -44,7 +45,7 @@ SECTIONS
|
||||||
__ex_table : { *(__ex_table) }
|
__ex_table : { *(__ex_table) }
|
||||||
__stop___ex_table = .;
|
__stop___ex_table = .;
|
||||||
|
|
||||||
. = ALIGN(8192);
|
. = ALIGN(PAGE_SIZE);
|
||||||
__init_begin = .;
|
__init_begin = .;
|
||||||
.init.text : {
|
.init.text : {
|
||||||
_sinittext = .;
|
_sinittext = .;
|
||||||
|
@ -83,17 +84,17 @@ SECTIONS
|
||||||
__sun4v_2insn_patch_end = .;
|
__sun4v_2insn_patch_end = .;
|
||||||
|
|
||||||
#ifdef CONFIG_BLK_DEV_INITRD
|
#ifdef CONFIG_BLK_DEV_INITRD
|
||||||
. = ALIGN(8192);
|
. = ALIGN(PAGE_SIZE);
|
||||||
__initramfs_start = .;
|
__initramfs_start = .;
|
||||||
.init.ramfs : { *(.init.ramfs) }
|
.init.ramfs : { *(.init.ramfs) }
|
||||||
__initramfs_end = .;
|
__initramfs_end = .;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
. = ALIGN(8192);
|
. = ALIGN(PAGE_SIZE);
|
||||||
__per_cpu_start = .;
|
__per_cpu_start = .;
|
||||||
.data.percpu : { *(.data.percpu) }
|
.data.percpu : { *(.data.percpu) }
|
||||||
__per_cpu_end = .;
|
__per_cpu_end = .;
|
||||||
. = ALIGN(8192);
|
. = ALIGN(PAGE_SIZE);
|
||||||
__init_end = .;
|
__init_end = .;
|
||||||
__bss_start = .;
|
__bss_start = .;
|
||||||
.sbss : { *(.sbss) *(.scommon) }
|
.sbss : { *(.sbss) *(.scommon) }
|
||||||
|
|
|
@ -14,8 +14,8 @@
|
||||||
*(.data) \
|
*(.data) \
|
||||||
*(.data.init.refok)
|
*(.data.init.refok)
|
||||||
|
|
||||||
#define RODATA \
|
#define RO_DATA(align) \
|
||||||
. = ALIGN(4096); \
|
. = ALIGN((align)); \
|
||||||
.rodata : AT(ADDR(.rodata) - LOAD_OFFSET) { \
|
.rodata : AT(ADDR(.rodata) - LOAD_OFFSET) { \
|
||||||
VMLINUX_SYMBOL(__start_rodata) = .; \
|
VMLINUX_SYMBOL(__start_rodata) = .; \
|
||||||
*(.rodata) *(.rodata.*) \
|
*(.rodata) *(.rodata.*) \
|
||||||
|
@ -135,7 +135,11 @@
|
||||||
VMLINUX_SYMBOL(__end_rodata) = .; \
|
VMLINUX_SYMBOL(__end_rodata) = .; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
. = ALIGN(4096);
|
. = ALIGN((align));
|
||||||
|
|
||||||
|
/* RODATA provided for backward compatibility.
|
||||||
|
* All archs are supposed to use RO_DATA() */
|
||||||
|
#define RODATA RO_DATA(4096)
|
||||||
|
|
||||||
#define SECURITY_INIT \
|
#define SECURITY_INIT \
|
||||||
.security_initcall.init : AT(ADDR(.security_initcall.init) - LOAD_OFFSET) { \
|
.security_initcall.init : AT(ADDR(.security_initcall.init) - LOAD_OFFSET) { \
|
||||||
|
|
Загрузка…
Ссылка в новой задаче