Re: [EXPERIMENTAL] enable thin archives and --gc-sections on ARM

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, 11 Aug 2016, Arnd Bergmann wrote:

> This goes on top of Nick's latest version of "[PATCH 0/6 v2] kbuild changes,
> thin archives, --gc-sections" and enables both features on ARM.
> 
[...]
> 
> - I mark a ton of sections as KEEP() in vmlinux.lds.S. Some of
>   them might not actually be needed, and I have not spent much
>   time checking what they actually are. However, I did build
>   a few hundred randconfigs without new issues.
> 
> index 7396a5f00c5f..61b9b8784036 100644
> --- a/arch/arm/kernel/vmlinux.lds.S
> +++ b/arch/arm/kernel/vmlinux.lds.S
> @@ -17,7 +17,7 @@
>  #define PROC_INFO							\
>  	. = ALIGN(4);							\
>  	VMLINUX_SYMBOL(__proc_info_begin) = .;				\
> -	*(.proc.info.init)						\
> +	KEEP(*(.proc.info.init))					\

OK.

>  	VMLINUX_SYMBOL(__proc_info_end) = .;
>  
>  #define HYPERVISOR_TEXT							\
> @@ -104,7 +104,7 @@ SECTIONS
>  		_stext = .;		/* Text and read-only data	*/
>  			IDMAP_TEXT
>  			__exception_text_start = .;
> -			*(.exception.text)
> +			KEEP(*(.exception.text))

No need here. The code there has to be referenced from somewhere. If not 
it should not be kept.

>  			__exception_text_end = .;
>  			IRQENTRY_TEXT
>  			SOFTIRQENTRY_TEXT
> @@ -169,14 +169,14 @@ SECTIONS
>  	 */
>  	__vectors_start = .;
>  	.vectors 0xffff0000 : AT(__vectors_start) {
> -		*(.vectors)
> +		KEEP(*(.vectors))

OK.

>  	}
>  	. = __vectors_start + SIZEOF(.vectors);
>  	__vectors_end = .;
>  
>  	__stubs_start = .;
>  	.stubs ADDR(.vectors) + 0x1000 : AT(__stubs_start) {
> -		*(.stubs)
> +		KEEP(*(.stubs))

This is referenced from .vectors entries and therefore the KEEP() is not 
needed.  There is nothing to be saved either ways though.

>  	}
>  	. = __stubs_start + SIZEOF(.stubs);
>  	__stubs_end = .;
> @@ -192,24 +192,24 @@ SECTIONS
>  	}
>  	.init.arch.info : {
>  		__arch_info_begin = .;
> -		*(.arch.info.init)
> +		KEEP(*(.arch.info.init))

OK.

>  		__arch_info_end = .;
>  	}
>  	.init.tagtable : {
>  		__tagtable_begin = .;
> -		*(.taglist.init)
> +		KEEP(*(.taglist.init))

OK.

>  		__tagtable_end = .;
>  	}
>  #ifdef CONFIG_SMP_ON_UP
>  	.init.smpalt : {
>  		__smpalt_begin = .;
> -		*(.alt.smp.init)
> +		KEEP(*(.alt.smp.init))

Yes unfortunately this needs a KEEP() right now as there is no explicit 
references to those entries. But by doing so you force a reference from 
those entries to all functions they annotate, preventing those functions 
from being discarded if there isn't any reference to that code 
otherwise. That's a case that falls into the "missing forward reference" 
category in my slides.

>  		__smpalt_end = .;
>  	}
>  #endif
>  	.init.pv_table : {
>  		__pv_table_begin = .;
> -		*(.pv_table)
> +		KEEP(*(.pv_table))

Ditto here.


Nicolas
--
To unsubscribe from this list: send the line "unsubscribe linux-arch" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Kernel]     [Kernel Newbies]     [x86 Platform Driver]     [Netdev]     [Linux Wireless]     [Netfilter]     [Bugtraq]     [Linux Filesystems]     [Yosemite Discussion]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Device Mapper]

  Powered by Linux