405d967dc7
x86 throws away .discard section but no other archs do. Also, .discard is not thrown away while linking modules. Make every arch and module linking throw it away. This will be used to define dummy variables for percpu declarations and definitions. This patch is based on Ivan Kokshaysky's alpha percpu patch. [ Impact: always throw away everything in .discard ] Signed-off-by: Tejun Heo <tj@kernel.org> Cc: Ivan Kokshaysky <ink@jurassic.park.msu.ru> Cc: Richard Henderson <rth@twiddle.net> Cc: Russell King <linux@arm.linux.org.uk> Cc: Haavard Skinnemoen <hskinnemoen@atmel.com> Cc: Bryan Wu <cooloney@kernel.org> Cc: Mikael Starvik <starvik@axis.com> Cc: Jesper Nilsson <jesper.nilsson@axis.com> Cc: David Howells <dhowells@redhat.com> Cc: Yoshinori Sato <ysato@users.sourceforge.jp> Cc: Tony Luck <tony.luck@intel.com> Cc: Hirokazu Takata <takata@linux-m32r.org> Cc: Geert Uytterhoeven <geert@linux-m68k.org> Cc: Michal Simek <monstr@monstr.eu> Cc: Ralf Baechle <ralf@linux-mips.org> Cc: Kyle McMartin <kyle@mcmartin.ca> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Martin Schwidefsky <schwidefsky@de.ibm.com> Cc: Heiko Carstens <heiko.carstens@de.ibm.com> Cc: Paul Mundt <lethal@linux-sh.org> Cc: David S. Miller <davem@davemloft.net> Cc: Jeff Dike <jdike@addtoit.com> Cc: Chris Zankel <chris@zankel.net> Cc: Rusty Russell <rusty@rustcorp.com.au> Cc: Ingo Molnar <mingo@elte.hu>
180 lines
3.6 KiB
ArmAsm
180 lines
3.6 KiB
ArmAsm
/*
|
|
* ld script to make SuperH Linux kernel
|
|
* Written by Niibe Yutaka and Paul Mundt
|
|
*/
|
|
#ifdef CONFIG_SUPERH64
|
|
#define LOAD_OFFSET CONFIG_PAGE_OFFSET
|
|
OUTPUT_ARCH(sh:sh5)
|
|
#else
|
|
#define LOAD_OFFSET 0
|
|
OUTPUT_ARCH(sh)
|
|
#endif
|
|
|
|
#include <asm/thread_info.h>
|
|
#include <asm/cache.h>
|
|
#include <asm-generic/vmlinux.lds.h>
|
|
|
|
ENTRY(_start)
|
|
SECTIONS
|
|
{
|
|
#ifdef CONFIG_PMB_FIXED
|
|
. = CONFIG_PAGE_OFFSET + (CONFIG_MEMORY_START & 0x1fffffff) +
|
|
CONFIG_ZERO_PAGE_OFFSET;
|
|
#elif defined(CONFIG_32BIT)
|
|
. = CONFIG_PAGE_OFFSET + CONFIG_ZERO_PAGE_OFFSET;
|
|
#else
|
|
. = CONFIG_PAGE_OFFSET + CONFIG_MEMORY_START + CONFIG_ZERO_PAGE_OFFSET;
|
|
#endif
|
|
|
|
_text = .; /* Text and read-only data */
|
|
|
|
.empty_zero_page : AT(ADDR(.empty_zero_page) - LOAD_OFFSET) {
|
|
*(.empty_zero_page)
|
|
} = 0
|
|
|
|
.text : AT(ADDR(.text) - LOAD_OFFSET) {
|
|
HEAD_TEXT
|
|
TEXT_TEXT
|
|
|
|
#ifdef CONFIG_SUPERH64
|
|
*(.text64)
|
|
*(.text..SHmedia32)
|
|
#endif
|
|
|
|
SCHED_TEXT
|
|
LOCK_TEXT
|
|
KPROBES_TEXT
|
|
IRQENTRY_TEXT
|
|
*(.fixup)
|
|
*(.gnu.warning)
|
|
_etext = .; /* End of text section */
|
|
} = 0x0009
|
|
|
|
. = ALIGN(16); /* Exception table */
|
|
__ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) {
|
|
__start___ex_table = .;
|
|
*(__ex_table)
|
|
__stop___ex_table = .;
|
|
}
|
|
|
|
NOTES
|
|
RO_DATA(PAGE_SIZE)
|
|
|
|
/*
|
|
* Code which must be executed uncached and the associated data
|
|
*/
|
|
. = ALIGN(PAGE_SIZE);
|
|
.uncached : AT(ADDR(.uncached) - LOAD_OFFSET) {
|
|
__uncached_start = .;
|
|
*(.uncached.text)
|
|
*(.uncached.data)
|
|
__uncached_end = .;
|
|
}
|
|
|
|
. = ALIGN(THREAD_SIZE);
|
|
.data : AT(ADDR(.data) - LOAD_OFFSET) { /* Data */
|
|
*(.data.init_task)
|
|
|
|
. = ALIGN(L1_CACHE_BYTES);
|
|
*(.data.cacheline_aligned)
|
|
|
|
. = ALIGN(L1_CACHE_BYTES);
|
|
*(.data.read_mostly)
|
|
|
|
. = ALIGN(PAGE_SIZE);
|
|
*(.data.page_aligned)
|
|
|
|
__nosave_begin = .;
|
|
*(.data.nosave)
|
|
. = ALIGN(PAGE_SIZE);
|
|
__nosave_end = .;
|
|
|
|
DATA_DATA
|
|
CONSTRUCTORS
|
|
}
|
|
|
|
_edata = .; /* End of data section */
|
|
|
|
. = ALIGN(PAGE_SIZE); /* Init code and data */
|
|
.init.text : AT(ADDR(.init.text) - LOAD_OFFSET) {
|
|
__init_begin = .;
|
|
_sinittext = .;
|
|
INIT_TEXT
|
|
_einittext = .;
|
|
}
|
|
|
|
.init.data : AT(ADDR(.init.data) - LOAD_OFFSET) { INIT_DATA }
|
|
|
|
. = ALIGN(16);
|
|
.init.setup : AT(ADDR(.init.setup) - LOAD_OFFSET) {
|
|
__setup_start = .;
|
|
*(.init.setup)
|
|
__setup_end = .;
|
|
}
|
|
|
|
.initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) {
|
|
__initcall_start = .;
|
|
INITCALLS
|
|
__initcall_end = .;
|
|
}
|
|
|
|
.con_initcall.init : AT(ADDR(.con_initcall.init) - LOAD_OFFSET) {
|
|
__con_initcall_start = .;
|
|
*(.con_initcall.init)
|
|
__con_initcall_end = .;
|
|
}
|
|
|
|
SECURITY_INIT
|
|
|
|
#ifdef CONFIG_BLK_DEV_INITRD
|
|
. = ALIGN(PAGE_SIZE);
|
|
.init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET) {
|
|
__initramfs_start = .;
|
|
*(.init.ramfs)
|
|
__initramfs_end = .;
|
|
}
|
|
#endif
|
|
|
|
. = ALIGN(4);
|
|
.machvec.init : AT(ADDR(.machvec.init) - LOAD_OFFSET) {
|
|
__machvec_start = .;
|
|
*(.machvec.init)
|
|
__machvec_end = .;
|
|
}
|
|
|
|
PERCPU(PAGE_SIZE)
|
|
|
|
/*
|
|
* .exit.text is discarded at runtime, not link time, to deal with
|
|
* references from __bug_table
|
|
*/
|
|
.exit.text : AT(ADDR(.exit.text) - LOAD_OFFSET) { EXIT_TEXT }
|
|
.exit.data : AT(ADDR(.exit.data) - LOAD_OFFSET) { EXIT_DATA }
|
|
|
|
. = ALIGN(PAGE_SIZE);
|
|
.bss : AT(ADDR(.bss) - LOAD_OFFSET) {
|
|
__init_end = .;
|
|
__bss_start = .; /* BSS */
|
|
*(.bss.page_aligned)
|
|
*(.bss)
|
|
*(COMMON)
|
|
. = ALIGN(4);
|
|
_ebss = .; /* uClinux MTD sucks */
|
|
_end = . ;
|
|
}
|
|
|
|
/*
|
|
* When something in the kernel is NOT compiled as a module, the
|
|
* module cleanup code and data are put into these segments. Both
|
|
* can then be thrown away, as cleanup code is never called unless
|
|
* it's a module.
|
|
*/
|
|
/DISCARD/ : {
|
|
*(.exitcall.exit)
|
|
*(.discard)
|
|
}
|
|
|
|
STABS_DEBUG
|
|
DWARF_DEBUG
|
|
}
|