[PATCH] ARM: Thumb-2: Work around buggy Thumb-2 short branch relocations in gas

Nicolas Pitre nicolas.pitre at linaro.org
Mon Feb 28 14:58:11 EST 2011


On Mon, 28 Feb 2011, Dave Martin wrote:

> Various binutils versions can resolve Thumb-2 branches to
> locally-defined, preemptible global symbols as short-range "b.n"
> branch instructions.
> 
> This is a problem, because there's no guarantee the final
> destination of the symbol, or any candidate locations for a
> trampoline, are within range of the branch.  For this reason, the
> kernel does not support fixing up the R_ARM_THM_JUMP11 (102)
> relocation in modules at all, and it makes little sense to add
> support.
> 
> The symptom is that the kernel fails with an "unsupported
> relocation" error when loading some modules.
> 
> Until fixed tools are available, passing
> -fno-optimize-sibling-calls to gcc should prevent gcc generating
> code which hits this problem, at the cost of a bit of extra runtime
> stack usage in some cases.
> 
> The problem is described in more detail at:
>     https://bugs.launchpad.net/binutils-linaro/+bug/725126
> 
> Only Thumb-2 kernels are affected.
> 
> This patch adds a new CONFIG_THUMB2_AVOID_R_ARM_THM_JUMP11 config
> option which adds -fno-optimize-sibling-calls to CFLAGS_MODULE
> when building a Thumb-2 kernel.
> 
> Signed-off-by: Dave Martin <dave.martin at linaro.org>

Acked-by: Nicolas Pitre <nicolas.pitre at linaro.org>

> ---
>  arch/arm/Kconfig  |   31 +++++++++++++++++++++++++++++++
>  arch/arm/Makefile |    4 ++++
>  2 files changed, 35 insertions(+), 0 deletions(-)
> 
> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
> index 5cff165..196f6d2 100644
> --- a/arch/arm/Kconfig
> +++ b/arch/arm/Kconfig
> @@ -1371,6 +1371,37 @@ config THUMB2_KERNEL
>  
>  	  If unsure, say N.
>  
> +config THUMB2_AVOID_R_ARM_THM_JUMP11
> +	bool "Work around buggy Thumb-2 short branch relocations in gas"
> +	depends on THUMB2_KERNEL && MODULES
> +	default y
> +	help
> +	  Various binutils versions can resolve Thumb-2 branches to
> +	  locally-defined, preemptible global symbols as short-range "b.n"
> +	  branch instructions.
> +
> +	  This is a problem, because there's no guarantee the final
> +	  destination of the symbol, or any candidate locations for a
> +	  trampoline, are within range of the branch.  For this reason, the
> +	  kernel does not support fixing up the R_ARM_THM_JUMP11 (102)
> +	  relocation in modules at all, and it makes little sense to add
> +	  support.
> +
> +	  The symptom is that the kernel fails with an "unsupported
> +	  relocation" error when loading some modules.
> +
> +	  Until fixed tools are available, passing
> +	  -fno-optimize-sibling-calls to gcc should prevent gcc generating
> +	  code which hits this problem, at the cost of a bit of extra runtime
> +	  stack usage in some cases.
> +
> +	  The problem is described in more detail at:
> +	      https://bugs.launchpad.net/binutils-linaro/+bug/725126
> +
> +	  Only Thumb-2 kernels are affected.
> +
> +	  Unless you are sure your tools don't have this problem, say Y.
> +
>  config ARM_ASM_UNIFIED
>  	bool
>  
> diff --git a/arch/arm/Makefile b/arch/arm/Makefile
> index c22c1ad..ef5105a 100644
> --- a/arch/arm/Makefile
> +++ b/arch/arm/Makefile
> @@ -105,6 +105,10 @@ AFLAGS_AUTOIT	:=$(call as-option,-Wa$(comma)-mimplicit-it=always,-Wa$(comma)-mau
>  AFLAGS_NOWARN	:=$(call as-option,-Wa$(comma)-mno-warn-deprecated,-Wa$(comma)-W)
>  CFLAGS_THUMB2	:=-mthumb $(AFLAGS_AUTOIT) $(AFLAGS_NOWARN)
>  AFLAGS_THUMB2	:=$(CFLAGS_THUMB2) -Wa$(comma)-mthumb
> +# Work around buggy relocation from gas if requested:
> +ifeq ($(CONFIG_THUMB2_AVOID_R_ARM_THM_JUMP11),y)
> +CFLAGS_MODULE	+=-fno-optimize-sibling-calls
> +endif
>  endif
>  
>  # Need -Uarm for gcc < 3.x
> -- 
> 1.7.1
> 
> 
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
> 



More information about the linux-arm-kernel mailing list