[PATCH v2] ARM: Avoid discarding sections that might have SMP_ON_UP fixups SMP_ON_UP fixups

Dave Martin dave.martin at linaro.org
Thu Jan 27 09:37:09 EST 2011


On Wed, Jan 26, 2011 at 04:31:37PM -0500, Nicolas Pitre wrote:
> Since discarded sections are by definition not used, we should at least 
> put them into the .init section so to discard them at run time.  And 
> only the EXIT_TEXT and EXIT_DATA would need to be kept (see x86 for 
> example).
> 
> 
> Nicolas

I'll check up on whether we need to care about writable data.
For now I've just attempted to move stuff to .init.

Cheers
---Dave



v2: Also move the .exit stuff to the .init area where it can
be discarded on boot.  The result builds, but I haven't tested it
yet.

v1:

SMP_ON_UP fixups lead to vmlinux link errors if those sections are
discarded at link-time.  In particular this may happen for built-in
__exit stuff.

This patch modifies the vmlinux linker script to reduce the amount
of discarded sections, and tries to make sure that __exit sections
are kept in.

This is a hack and probably wrong!

Signed-off-by: Dave Martin <dave.martin at linaro.org>
---
 arch/arm/kernel/vmlinux.lds.S |   18 ++++++++++++++++++
 1 files changed, 18 insertions(+), 0 deletions(-)

diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S
index 45b5651..5774b95 100644
--- a/arch/arm/kernel/vmlinux.lds.S
+++ b/arch/arm/kernel/vmlinux.lds.S
@@ -43,6 +43,17 @@ SECTIONS
 		_sinittext = .;
 			HEAD_TEXT
 			INIT_TEXT
+#ifdef CONFIG_SMP_ON_UP
+			*(.exit.text)
+			CPU_KEEP(exit.text)
+			DEV_KEEP(exit.text)
+			MEM_KEEP(exit.text)
+#endif
+#ifdef CONFIG_SMP_ON_UP
+			CPU_KEEP(exit.rodata)
+			DEV_KEEP(exit.rodata)
+			MEM_KEEP(exit.rodata)
+#endif
 		_einittext = .;
 		ARM_CPU_DISCARD(PROC_INFO)
 		__arch_info_begin = .;
@@ -72,6 +83,11 @@ SECTIONS
 		__init_begin = _stext;
 		INIT_DATA
 #endif
+#ifdef CONFIG_SMP_ON_UP
+		DEV_KEEP(exit.data)
+		CPU_KEEP(exit.data)
+		MEM_KEEP(exit.data)
+#endif
 	}
 
 	PERCPU(PAGE_SIZE)
@@ -85,6 +101,7 @@ SECTIONS
 	 * unwind exit sections must be discarded before the rest of the
 	 * unwind sections get included.
 	 */
+#ifndef CONFIG_SMP_ON_UP
 	/DISCARD/ : {
 		*(.ARM.exidx.exit.text)
 		*(.ARM.extab.exit.text)
@@ -99,6 +116,7 @@ SECTIONS
 		*(__ex_table)
 #endif
 	}
+#endif
 
 	.text : {			/* Real text segment		*/
 		_text = .;		/* Text and read-only data	*/
-- 
1.7.1




More information about the linux-arm-kernel mailing list