![Stephen Rothwell](/assets/img/avatar_default.png)
An allyesconfig build creates a .text section that is so big that the .text.init.refok and .fixup sections are too far away for the relocations to be fixed up correctly. This patch fixes that by linking all the relevent text sections for each file together. Suggested by Paul Mackerras. Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au> Signed-off-by: Paul Mackerras <paulus@samba.org>
250 lines
3.7 KiB
ArmAsm
250 lines
3.7 KiB
ArmAsm
#ifdef CONFIG_PPC64
|
|
#include <asm/page.h>
|
|
#define PROVIDE32(x) PROVIDE(__unused__##x)
|
|
#else
|
|
#define PAGE_SIZE 4096
|
|
#define KERNELBASE CONFIG_KERNEL_START
|
|
#define PROVIDE32(x) PROVIDE(x)
|
|
#endif
|
|
#include <asm-generic/vmlinux.lds.h>
|
|
#include <asm/cache.h>
|
|
|
|
ENTRY(_stext)
|
|
|
|
#ifdef CONFIG_PPC64
|
|
OUTPUT_ARCH(powerpc:common64)
|
|
jiffies = jiffies_64;
|
|
#else
|
|
OUTPUT_ARCH(powerpc:common)
|
|
jiffies = jiffies_64 + 4;
|
|
#endif
|
|
SECTIONS
|
|
{
|
|
/* Sections to be discarded. */
|
|
/DISCARD/ : {
|
|
*(.exitcall.exit)
|
|
*(.exit.data)
|
|
}
|
|
|
|
. = KERNELBASE;
|
|
|
|
/*
|
|
* Text, read only data and other permanent read-only sections
|
|
*/
|
|
|
|
/* Text and gots */
|
|
.text : {
|
|
ALIGN_FUNCTION();
|
|
*(.text.head)
|
|
_text = .;
|
|
*(.text .fixup .text.init.refok .exit.text.refok)
|
|
SCHED_TEXT
|
|
LOCK_TEXT
|
|
KPROBES_TEXT
|
|
|
|
#ifdef CONFIG_PPC32
|
|
*(.got1)
|
|
__got2_start = .;
|
|
*(.got2)
|
|
__got2_end = .;
|
|
#endif /* CONFIG_PPC32 */
|
|
|
|
. = ALIGN(PAGE_SIZE);
|
|
_etext = .;
|
|
PROVIDE32 (etext = .);
|
|
}
|
|
|
|
/* Read-only data */
|
|
RODATA
|
|
|
|
/* Exception & bug tables */
|
|
__ex_table : {
|
|
__start___ex_table = .;
|
|
*(__ex_table)
|
|
__stop___ex_table = .;
|
|
}
|
|
|
|
NOTES
|
|
|
|
BUG_TABLE
|
|
|
|
/*
|
|
* Init sections discarded at runtime
|
|
*/
|
|
. = ALIGN(PAGE_SIZE);
|
|
__init_begin = .;
|
|
|
|
.init.text : {
|
|
_sinittext = .;
|
|
*(.init.text)
|
|
_einittext = .;
|
|
}
|
|
|
|
/* .exit.text is discarded at runtime, not link time,
|
|
* to deal with references from __bug_table
|
|
*/
|
|
.exit.text : { *(.exit.text) }
|
|
|
|
.init.data : {
|
|
*(.init.data);
|
|
__vtop_table_begin = .;
|
|
*(.vtop_fixup);
|
|
__vtop_table_end = .;
|
|
__ptov_table_begin = .;
|
|
*(.ptov_fixup);
|
|
__ptov_table_end = .;
|
|
#ifdef CONFIG_PPC_ISERIES
|
|
__dt_strings_start = .;
|
|
*(.dt_strings);
|
|
__dt_strings_end = .;
|
|
#endif
|
|
}
|
|
|
|
. = ALIGN(16);
|
|
.init.setup : {
|
|
__setup_start = .;
|
|
*(.init.setup)
|
|
__setup_end = .;
|
|
}
|
|
|
|
.initcall.init : {
|
|
__initcall_start = .;
|
|
INITCALLS
|
|
__initcall_end = .;
|
|
}
|
|
|
|
.con_initcall.init : {
|
|
__con_initcall_start = .;
|
|
*(.con_initcall.init)
|
|
__con_initcall_end = .;
|
|
}
|
|
|
|
SECURITY_INIT
|
|
|
|
. = ALIGN(8);
|
|
__ftr_fixup : {
|
|
__start___ftr_fixup = .;
|
|
*(__ftr_fixup)
|
|
__stop___ftr_fixup = .;
|
|
}
|
|
#ifdef CONFIG_PPC64
|
|
. = ALIGN(8);
|
|
__fw_ftr_fixup : {
|
|
__start___fw_ftr_fixup = .;
|
|
*(__fw_ftr_fixup)
|
|
__stop___fw_ftr_fixup = .;
|
|
}
|
|
#endif
|
|
#ifdef CONFIG_BLK_DEV_INITRD
|
|
. = ALIGN(PAGE_SIZE);
|
|
.init.ramfs : {
|
|
__initramfs_start = .;
|
|
*(.init.ramfs)
|
|
__initramfs_end = .;
|
|
}
|
|
#endif
|
|
. = ALIGN(PAGE_SIZE);
|
|
.data.percpu : {
|
|
__per_cpu_start = .;
|
|
*(.data.percpu)
|
|
*(.data.percpu.shared_aligned)
|
|
__per_cpu_end = .;
|
|
}
|
|
|
|
. = ALIGN(8);
|
|
.machine.desc : {
|
|
__machine_desc_start = . ;
|
|
*(.machine.desc)
|
|
__machine_desc_end = . ;
|
|
}
|
|
|
|
/* freed after init ends here */
|
|
. = ALIGN(PAGE_SIZE);
|
|
__init_end = .;
|
|
|
|
/*
|
|
* And now the various read/write data
|
|
*/
|
|
|
|
. = ALIGN(PAGE_SIZE);
|
|
_sdata = .;
|
|
|
|
#ifdef CONFIG_PPC32
|
|
.data :
|
|
{
|
|
DATA_DATA
|
|
*(.sdata)
|
|
*(.got.plt) *(.got)
|
|
}
|
|
#else
|
|
.data : {
|
|
DATA_DATA
|
|
*(.data.rel*)
|
|
*(.toc1)
|
|
*(.branch_lt)
|
|
}
|
|
|
|
.opd : {
|
|
*(.opd)
|
|
}
|
|
|
|
.got : {
|
|
__toc_start = .;
|
|
*(.got)
|
|
*(.toc)
|
|
}
|
|
#endif
|
|
|
|
. = ALIGN(PAGE_SIZE);
|
|
_edata = .;
|
|
PROVIDE32 (edata = .);
|
|
|
|
/* The initial task and kernel stack */
|
|
#ifdef CONFIG_PPC32
|
|
. = ALIGN(8192);
|
|
#else
|
|
. = ALIGN(16384);
|
|
#endif
|
|
.data.init_task : {
|
|
*(.data.init_task)
|
|
}
|
|
|
|
. = ALIGN(PAGE_SIZE);
|
|
.data.page_aligned : {
|
|
*(.data.page_aligned)
|
|
}
|
|
|
|
.data.cacheline_aligned : {
|
|
*(.data.cacheline_aligned)
|
|
}
|
|
|
|
. = ALIGN(L1_CACHE_BYTES);
|
|
.data.read_mostly : {
|
|
*(.data.read_mostly)
|
|
}
|
|
|
|
. = ALIGN(PAGE_SIZE);
|
|
__data_nosave : {
|
|
__nosave_begin = .;
|
|
*(.data.nosave)
|
|
. = ALIGN(PAGE_SIZE);
|
|
__nosave_end = .;
|
|
}
|
|
|
|
/*
|
|
* And finally the bss
|
|
*/
|
|
|
|
.bss : {
|
|
__bss_start = .;
|
|
*(.sbss) *(.scommon)
|
|
*(.dynbss)
|
|
*(.bss)
|
|
*(COMMON)
|
|
__bss_stop = .;
|
|
}
|
|
|
|
. = ALIGN(PAGE_SIZE);
|
|
_end = . ;
|
|
PROVIDE32 (end = .);
|
|
}
|