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

Dave P. Martin dave.martin at linaro.org
Wed Jan 26 12:25:35 EST 2011


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!  Further discussion is needed.  

Signed-off-by: Dave Martin <dave.martin at linaro.org>
---

On Wed, Jan 26, 2011 at 12:44:52PM +0000, Russell King - ARM Linux wrote:
> On Wed, Jan 26, 2011 at 11:11:31AM +0000, Dave Martin wrote:
> > Do we need to consider any other discarded sections?  In vmlinux.lds, I have:
> > 
> >  /* Default discards */
> >  /DISCARD/ : { *(.exit.text) *(.cpuexit.text) *(.memexit.text)
> > *(.exit.data) *(.cpuexit.data) *(.cpuexit.rodata) *(.memexit.data)
> > *(.memexit.rodata) *(.exitcall.exit) *(.discard) *(.discard.*) }
> 
> We need to keep all the text exit stuff, and that could well want
> data exit stuff, so I think we need ot keep most of that.  Maybe not
> the .discard* stuff though.
> 
> > If we put every fixup in its own _section_ we might be able to
> > collapse those out of the list at link time too.  However, that seems
> > hard to achieve, since in order to do the correct link-time filtering
> > we would need the fixup's section name to be based on the referenced
> > section's name ... due to preprocessor limitations I don't think we
> > can do that automatically (and manual maintenance would be a bad
> > plan).
> 
> I suspect if it was sanely possible to do, then x86 would already be
> doing it as they've had this problem for a lot longer than we have.
> It might be worth talking to toolchain people to see if it can be made
> to work somehow - but we really don't want to get rid of all discarded
> section warnings.
> 
> IOW, if we have a text segment which is included in the image and it
> references discarded .exit text, we really do want it to fail at link
> time.

diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S
index 45b5651..473e30e 100644
--- a/arch/arm/kernel/vmlinux.lds.S
+++ b/arch/arm/kernel/vmlinux.lds.S
@@ -85,6 +85,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 +100,7 @@ SECTIONS
 		*(__ex_table)
 #endif
 	}
+#endif
 
 	.text : {			/* Real text segment		*/
 		_text = .;		/* Text and read-only data	*/
@@ -107,6 +109,12 @@ SECTIONS
 			__exception_text_end = .;
 			IRQENTRY_TEXT
 			TEXT_TEXT
+#ifdef CONFIG_SMP_ON_UP
+			*(.exit.text)
+			CPU_KEEP(exit.text)
+			DEV_KEEP(exit.text)
+			MEM_KEEP(exit.text)
+#endif
 			SCHED_TEXT
 			LOCK_TEXT
 			KPROBES_TEXT
@@ -116,6 +124,11 @@ SECTIONS
 			*(.gnu.warning)
 			*(.rodata)
 			*(.rodata.*)
+#ifdef CONFIG_SMP_ON_UP
+			CPU_KEEP(exit.rodata)
+			DEV_KEEP(exit.rodata)
+			MEM_KEEP(exit.rodata)
+#endif
 			*(.glue_7)
 			*(.glue_7t)
 		. = ALIGN(4);
@@ -188,6 +201,11 @@ SECTIONS
 		 * and the usual data section
 		 */
 		DATA_DATA
+#ifdef CONFIG_SMP_ON_UP
+		DEV_KEEP(exit.data)
+		CPU_KEEP(exit.data)
+		MEM_KEEP(exit.data)
+#endif
 		CONSTRUCTORS
 
 		_edata = .;
-- 
1.7.1




More information about the linux-arm-kernel mailing list