 5a45da02cf
			
		
	
	
	5a45da02cf
	
	
	
		
			
			* DWARF unwinder related
  + Force DWARF2 compliant .debug_frame (gcc 4.8 defaults to DWARF4
    which kernel unwinder can't grok).
  + Discard the additional .eh_frame generated
  + Discard the dwarf4 debug info generated by -gdwarf-2 for normal
    no debug case
* 4.8 already uses arc600 multilibs for -mno-mpy
* switch to using uclibc compiler (to get -mmedium-calls and -mno-sdata)
  and also since buildroot can only use 1 toolchain
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
		
	
			
		
			
				
	
	
		
			171 lines
		
	
	
	
		
			3.5 KiB
			
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			171 lines
		
	
	
	
		
			3.5 KiB
			
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| /*
 | |
|  * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
 | |
|  *
 | |
|  * This program is free software; you can redistribute it and/or modify
 | |
|  * it under the terms of the GNU General Public License version 2 as
 | |
|  * published by the Free Software Foundation.
 | |
|  */
 | |
| 
 | |
| #include <asm-generic/vmlinux.lds.h>
 | |
| #include <asm/cache.h>
 | |
| #include <asm/page.h>
 | |
| #include <asm/thread_info.h>
 | |
| 
 | |
| OUTPUT_ARCH(arc)
 | |
| ENTRY(_stext)
 | |
| 
 | |
| #ifdef CONFIG_CPU_BIG_ENDIAN
 | |
| jiffies = jiffies_64 + 4;
 | |
| #else
 | |
| jiffies = jiffies_64;
 | |
| #endif
 | |
| 
 | |
| SECTIONS
 | |
| {
 | |
| 	/*
 | |
| 	 * ICCM starts at 0x8000_0000. So if kernel is relocated to some other
 | |
| 	 * address, make sure peripheral at 0x8z doesn't clash with ICCM
 | |
| 	 * Essentially vector is also in ICCM.
 | |
| 	 */
 | |
| 
 | |
| 	. = CONFIG_LINUX_LINK_BASE;
 | |
| 
 | |
| 	_int_vec_base_lds = .;
 | |
| 	.vector : {
 | |
| 		*(.vector)
 | |
| 		. = ALIGN(PAGE_SIZE);
 | |
| 	}
 | |
| 
 | |
| #ifdef CONFIG_ARC_HAS_ICCM
 | |
| 	.text.arcfp : {
 | |
| 		*(.text.arcfp)
 | |
| 		. = ALIGN(CONFIG_ARC_ICCM_SZ * 1024);
 | |
| 	}
 | |
| #endif
 | |
| 
 | |
| 	/*
 | |
| 	 * The reason for having a seperate subsection .init.ramfs is to
 | |
| 	 * prevent objump from including it in kernel dumps
 | |
| 	 *
 | |
| 	 * Reason for having .init.ramfs above .init is to make sure that the
 | |
| 	 * binary blob is tucked away to one side, reducing the displacement
 | |
| 	 * between .init.text and .text, avoiding any possible relocation
 | |
| 	 * errors because of calls from .init.text to .text
 | |
| 	 * Yes such calls do exist. e.g.
 | |
| 	 *	decompress_inflate.c:gunzip( ) -> zlib_inflate_workspace( )
 | |
| 	 */
 | |
| 
 | |
| 	__init_begin = .;
 | |
| 
 | |
| 	.init.ramfs : { INIT_RAM_FS }
 | |
| 
 | |
| 	. = ALIGN(PAGE_SIZE);
 | |
| 	_stext = .;
 | |
| 
 | |
| 	HEAD_TEXT_SECTION
 | |
| 	INIT_TEXT_SECTION(L1_CACHE_BYTES)
 | |
| 
 | |
| 	/* INIT_DATA_SECTION open-coded: special INIT_RAM_FS handling */
 | |
| 	.init.data : {
 | |
| 		INIT_DATA
 | |
| 		INIT_SETUP(L1_CACHE_BYTES)
 | |
| 		INIT_CALLS
 | |
| 		CON_INITCALL
 | |
| 		SECURITY_INITCALL
 | |
| 	}
 | |
| 
 | |
| 	.init.arch.info : {
 | |
| 		__arch_info_begin = .;
 | |
| 		*(.arch.info.init)
 | |
| 		__arch_info_end = .;
 | |
| 	}
 | |
| 
 | |
| 	PERCPU_SECTION(L1_CACHE_BYTES)
 | |
| 
 | |
| 	/*
 | |
| 	 * .exit.text is discard at runtime, not link time, to deal with
 | |
| 	 * references from .debug_frame
 | |
| 	 * It will be init freed, being inside [__init_start : __init_end]
 | |
| 	 */
 | |
| 	.exit.text : { EXIT_TEXT }
 | |
| 	.exit.data : { EXIT_DATA }
 | |
| 
 | |
| 	. = ALIGN(PAGE_SIZE);
 | |
| 	__init_end = .;
 | |
| 
 | |
| 	.text : {
 | |
| 		_text = .;
 | |
| 		TEXT_TEXT
 | |
| 		SCHED_TEXT
 | |
| 		LOCK_TEXT
 | |
| 		KPROBES_TEXT
 | |
| 		*(.fixup)
 | |
| 		*(.gnu.warning)
 | |
| 	}
 | |
| 	EXCEPTION_TABLE(L1_CACHE_BYTES)
 | |
| 	_etext = .;
 | |
| 
 | |
| 	_sdata = .;
 | |
| 	RO_DATA_SECTION(PAGE_SIZE)
 | |
| 
 | |
| 	/*
 | |
| 	 * 1. this is .data essentially
 | |
| 	 * 2. THREAD_SIZE for init.task, must be kernel-stk sz aligned
 | |
| 	 */
 | |
| 	RW_DATA_SECTION(L1_CACHE_BYTES, PAGE_SIZE, THREAD_SIZE)
 | |
| 
 | |
| 	_edata = .;
 | |
| 
 | |
| 	BSS_SECTION(0, 0, 0)
 | |
| 
 | |
| #ifdef CONFIG_ARC_DW2_UNWIND
 | |
| 	. = ALIGN(PAGE_SIZE);
 | |
| 	.debug_frame  : {
 | |
| 		__start_unwind = .;
 | |
| 		*(.debug_frame)
 | |
| 		__end_unwind = .;
 | |
| 	}
 | |
| 	/*
 | |
| 	 * gcc 4.8 generates this for -fasynchonous-unwind-tables,
 | |
| 	 * while we still use the .debug_frame based unwinder
 | |
| 	 */
 | |
| 	/DISCARD/ : {	*(.eh_frame) }
 | |
| #else
 | |
| 	/DISCARD/ : {	*(.debug_frame) }
 | |
| #endif
 | |
| 
 | |
| 	NOTES
 | |
| 
 | |
| 	. = ALIGN(PAGE_SIZE);
 | |
| 	_end = . ;
 | |
| 
 | |
| 	STABS_DEBUG
 | |
| 	DISCARDS
 | |
| 
 | |
| 	.arcextmap 0 : {
 | |
| 		*(.gnu.linkonce.arcextmap.*)
 | |
| 		*(.arcextmap.*)
 | |
| 	}
 | |
| 
 | |
| #ifndef CONFIG_DEBUG_INFO
 | |
| 	/* open-coded because we need .debug_frame seperately for unwinding */
 | |
| 	/DISCARD/ : { *(.debug_aranges) }
 | |
| 	/DISCARD/ : { *(.debug_pubnames) }
 | |
| 	/DISCARD/ : { *(.debug_info) }
 | |
| 	/DISCARD/ : { *(.debug_abbrev) }
 | |
| 	/DISCARD/ : { *(.debug_line) }
 | |
| 	/DISCARD/ : { *(.debug_str) }
 | |
| 	/DISCARD/ : { *(.debug_loc) }
 | |
| 	/DISCARD/ : { *(.debug_macinfo) }
 | |
| 	/DISCARD/ : { *(.debug_ranges) }
 | |
| #endif
 | |
| 
 | |
| #ifdef CONFIG_ARC_HAS_DCCM
 | |
| 	. = CONFIG_ARC_DCCM_BASE;
 | |
| 	__arc_dccm_base = .;
 | |
| 	.data.arcfp : {
 | |
| 		*(.data.arcfp)
 | |
| 	}
 | |
| 	. = ALIGN(CONFIG_ARC_DCCM_SZ * 1024);
 | |
| #endif
 | |
| }
 |