diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2018-09-17 08:24:25 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2018-09-17 09:33:54 +0200 |
commit | cec347bff0f2225540a8c188835978d46ab35790 (patch) | |
tree | 4d041f8aaa0f478763864b242a0565b2bdcc9f01 /arch/arm/cpu | |
parent | 1bcddfb3215c27a87e86190cf492aaa68fd0019f (diff) | |
download | barebox-cec347bff0f2225540a8c188835978d46ab35790.tar.gz barebox-cec347bff0f2225540a8c188835978d46ab35790.tar.xz |
ARM: Multi PBL: Fix image calculation for certain toolchains
The current way to calculate the compressed image position works
with the OSELAS toolchains, but not with the Debian/Ubuntu toolchains.
For these toolchains &image_end_marker already returns the correct
address, adding global_variable_offset() to it is wrong.
The solution seems to be to put the image_end_marker into a different
object file so that the compiler cannot play any tricks to resolve
the address internally in the object file.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'arch/arm/cpu')
-rw-r--r-- | arch/arm/cpu/sections.c | 2 | ||||
-rw-r--r-- | arch/arm/cpu/uncompress.c | 5 |
2 files changed, 3 insertions, 4 deletions
diff --git a/arch/arm/cpu/sections.c b/arch/arm/cpu/sections.c index 5874da2b82..ab08ebf42e 100644 --- a/arch/arm/cpu/sections.c +++ b/arch/arm/cpu/sections.c @@ -1,4 +1,5 @@ #include <asm/sections.h> +#include <linux/types.h> char __rel_dyn_start[0] __attribute__((section(".__rel_dyn_start"))); char __rel_dyn_end[0] __attribute__((section(".__rel_dyn_end"))); @@ -9,3 +10,4 @@ char __bss_start[0] __attribute__((section(".__bss_start"))); char __bss_stop[0] __attribute__((section(".__bss_stop"))); char __image_start[0] __attribute__((section(".__image_start"))); char __image_end[0] __attribute__((section(".__image_end"))); +uint32_t __image_end_marker[1] __attribute__((section(".__image_end_marker"))) = { 0xdeadbeef }; diff --git a/arch/arm/cpu/uncompress.c b/arch/arm/cpu/uncompress.c index b07087e4cf..43b49b4212 100644 --- a/arch/arm/cpu/uncompress.c +++ b/arch/arm/cpu/uncompress.c @@ -36,9 +36,6 @@ unsigned long free_mem_ptr; unsigned long free_mem_end_ptr; -static int __attribute__((__section__(".image_end"))) - image_end_marker = 0xdeadbeef; - void __noreturn barebox_multi_pbl_start(unsigned long membase, unsigned long memsize, void *boarddata) { @@ -50,7 +47,7 @@ void __noreturn barebox_multi_pbl_start(unsigned long membase, void *pg_start; unsigned long pc = get_pc(); - image_end = (void *)&image_end_marker + global_variable_offset(); + image_end = (void *)__image_end_marker + global_variable_offset(); if (IS_ENABLED(CONFIG_PBL_RELOCATABLE)) { /* |