aboutsummaryrefslogtreecommitdiff
path: root/arch/arm/boot
diff options
context:
space:
mode:
authorNicolas Pitre <nicolas.pitre@linaro.org>2011-04-19 21:55:22 -0400
committerNicolas Pitre <nicolas.pitre@linaro.org>2011-04-20 00:30:20 -0400
commit925f6039cebb771e0143c26bd9c63dfd1fa314db (patch)
treeeb3db5047fc503529b17487b690e6a25f6d9c853 /arch/arm/boot
parent8dcbf26fb5bf96bd3bad4a913ebef5459a0c0cf0 (diff)
ARM: zImage: fix issues with missing GOT entries for some global variables
Many architecture specific versions of uncompress.h make use of global variables marked static. In such case the GOT is bypassed and the code in head.S can't relocate them. Instead of removing the static keyword from all those files and hope that it won't come back, let's simply define it out. Signed-off-by: Nicolas Pitre <nicolas.pitre@linaro.org>
Diffstat (limited to 'arch/arm/boot')
-rw-r--r--arch/arm/boot/compressed/misc.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/arch/arm/boot/compressed/misc.c b/arch/arm/boot/compressed/misc.c
index a5658533e18..0125daead29 100644
--- a/arch/arm/boot/compressed/misc.c
+++ b/arch/arm/boot/compressed/misc.c
@@ -30,7 +30,20 @@ unsigned int __machine_arch_type;
static void putstr(const char *ptr);
extern void error(char *x);
+/*
+ * Many instances of mach/uncompress.h are including global variables.
+ * Contrary to standard usage, we should _not_ mark those variables
+ * static otherwise they get accessed via GOTOFF references which cannot
+ * be modified at run time. The entry code in head.S relies on the ability
+ * to move writable sections around, and for that to work, we must have all
+ * references going through the GOT which works only with non static
+ * variables. So, instead of asking for a non intuitive requirement
+ * making many files non standard according to accepted coding practices
+ * we fix the issue here by simply defining the static keyword to nothing.
+ */
+#define static /* non-static */
#include <mach/uncompress.h>
+#undef static
#ifdef CONFIG_DEBUG_ICEDCC