aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/boot
diff options
context:
space:
mode:
authorNicolas Pitre <nicolas.pitre@linaro.org>2011-04-27 14:54:39 -0400
committerNicolas Pitre <nico@fluxnic.net>2011-05-07 00:08:03 -0400
commit8d7e4cc2c8ea1d180d32d902eb899f27d3ee53d7 (patch)
tree899c64ebde52465cfae79f4908602ae4883e4c1e /arch/arm/boot
parent8ea0de4b8831513924e3ec6a17bb721fabf97055 (diff)
ARM: zImage: make sure no GOTOFF relocs are used with .bss symbols
To be able to relocate the .bss section at run time independently from the rest of the code, we must make sure that no GOTOFF relocations are used with .bss symbols. This usually means that no global variables can be marked static unless they're also const. To enforce this, suffice to fail the build whenever a private symbol is allocated to .bss and list those symbols for convenience. The user_stack and user_stack_end labels in head.S were converted into non exported symbols to remove false positives. Signed-off-by: Nicolas Pitre <nicolas.pitre@linaro.org> Tested-by: Tony Lindgren <tony@atomide.com>
Diffstat (limited to 'arch/arm/boot')
-rw-r--r--arch/arm/boot/compressed/Makefile15
-rw-r--r--arch/arm/boot/compressed/head.S6
2 files changed, 17 insertions, 4 deletions
diff --git a/arch/arm/boot/compressed/Makefile b/arch/arm/boot/compressed/Makefile
index 79b5c62746df..23aad0722303 100644
--- a/arch/arm/boot/compressed/Makefile
+++ b/arch/arm/boot/compressed/Makefile
@@ -120,10 +120,23 @@ lib1funcs = $(obj)/lib1funcs.o
120$(obj)/lib1funcs.S: $(srctree)/arch/$(SRCARCH)/lib/lib1funcs.S FORCE 120$(obj)/lib1funcs.S: $(srctree)/arch/$(SRCARCH)/lib/lib1funcs.S FORCE
121 $(call cmd,shipped) 121 $(call cmd,shipped)
122 122
123# We need to prevent any GOTOFF relocs being used with references
124# to symbols in the .bss section since we cannot relocate them
125# independently from the rest at run time. This can be achieved by
126# ensuring that no private .bss symbols exist, as global symbols
127# always have a GOT entry which is what we need.
128# The .data section is already discarded by the linker script so no need
129# to bother about it here.
130check_for_bad_syms = \
131bad_syms=$$($(CROSS_COMPILE)nm $@ | sed -n 's/^.\{8\} [bc] \(.*\)/\1/p') && \
132[ -z "$$bad_syms" ] || \
133 ( echo "following symbols must have non local/private scope:" >&2; \
134 echo "$$bad_syms" >&2; rm -f $@; false )
135
123$(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/$(HEAD) $(obj)/piggy.$(suffix_y).o \ 136$(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/$(HEAD) $(obj)/piggy.$(suffix_y).o \
124 $(addprefix $(obj)/, $(OBJS)) $(lib1funcs) FORCE 137 $(addprefix $(obj)/, $(OBJS)) $(lib1funcs) FORCE
125 $(call if_changed,ld) 138 $(call if_changed,ld)
126 @: 139 @$(check_for_bad_syms)
127 140
128$(obj)/piggy.$(suffix_y): $(obj)/../Image FORCE 141$(obj)/piggy.$(suffix_y): $(obj)/../Image FORCE
129 $(call if_changed,$(suffix_y)) 142 $(call if_changed,$(suffix_y))
diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S
index b541217bd040..8d5d91aefbb9 100644
--- a/arch/arm/boot/compressed/head.S
+++ b/arch/arm/boot/compressed/head.S
@@ -372,7 +372,7 @@ LC0: .word LC0 @ r1
372 .word input_data_end - 4 @ r10 (inflated size location) 372 .word input_data_end - 4 @ r10 (inflated size location)
373 .word _got_start @ r11 373 .word _got_start @ r11
374 .word _got_end @ ip 374 .word _got_end @ ip
375 .word user_stack_end @ sp 375 .word .L_user_stack_end @ sp
376 .size LC0, . - LC0 376 .size LC0, . - LC0
377 377
378#ifdef CONFIG_ARCH_RPC 378#ifdef CONFIG_ARCH_RPC
@@ -1100,5 +1100,5 @@ reloc_code_end:
1100 1100
1101 .align 1101 .align
1102 .section ".stack", "aw", %nobits 1102 .section ".stack", "aw", %nobits
1103user_stack: .space 4096 1103.L_user_stack: .space 4096
1104user_stack_end: 1104.L_user_stack_end: