diff options
Diffstat (limited to 'arch/arm/Kconfig')
-rw-r--r-- | arch/arm/Kconfig | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 2fec7073f687..f871f2e1dd7c 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -1379,6 +1379,37 @@ config THUMB2_KERNEL | |||
1379 | 1379 | ||
1380 | If unsure, say N. | 1380 | If unsure, say N. |
1381 | 1381 | ||
1382 | config THUMB2_AVOID_R_ARM_THM_JUMP11 | ||
1383 | bool "Work around buggy Thumb-2 short branch relocations in gas" | ||
1384 | depends on THUMB2_KERNEL && MODULES | ||
1385 | default y | ||
1386 | help | ||
1387 | Various binutils versions can resolve Thumb-2 branches to | ||
1388 | locally-defined, preemptible global symbols as short-range "b.n" | ||
1389 | branch instructions. | ||
1390 | |||
1391 | This is a problem, because there's no guarantee the final | ||
1392 | destination of the symbol, or any candidate locations for a | ||
1393 | trampoline, are within range of the branch. For this reason, the | ||
1394 | kernel does not support fixing up the R_ARM_THM_JUMP11 (102) | ||
1395 | relocation in modules at all, and it makes little sense to add | ||
1396 | support. | ||
1397 | |||
1398 | The symptom is that the kernel fails with an "unsupported | ||
1399 | relocation" error when loading some modules. | ||
1400 | |||
1401 | Until fixed tools are available, passing | ||
1402 | -fno-optimize-sibling-calls to gcc should prevent gcc generating | ||
1403 | code which hits this problem, at the cost of a bit of extra runtime | ||
1404 | stack usage in some cases. | ||
1405 | |||
1406 | The problem is described in more detail at: | ||
1407 | https://bugs.launchpad.net/binutils-linaro/+bug/725126 | ||
1408 | |||
1409 | Only Thumb-2 kernels are affected. | ||
1410 | |||
1411 | Unless you are sure your tools don't have this problem, say Y. | ||
1412 | |||
1382 | config ARM_ASM_UNIFIED | 1413 | config ARM_ASM_UNIFIED |
1383 | bool | 1414 | bool |
1384 | 1415 | ||