mirror of
https://xff.cz/git/u-boot/
synced 2025-10-02 07:51:17 +02:00
commit3ebd1cbc49
("arm: make __bss_start and __bss_end__ compiler-generated") and commitf84a7b8f54
("ARM: Fix __bss_start and __bss_end in linker scripts") were moving the bss_start/end on c generated variables that were injected in their own sections. The reason was that we needed relative relocations for position independent code and linker bugs back then prevented us from doing so [0]. However, the linker documentation pages states that symbols that are defined within a section definition will create a relocatable type with the value being a fixed offset from the base of a section [1]. So let's start cleaning this up starting with the bss_start and bss_end variables. Convert them into symbols within the .bss section definition. [0] binutils commit 6b3b0ab89663 ("Make linker assigned symbol dynamic only for shared object") [1] https://sourceware.org/binutils/docs/ld/Expression-Section.html Tested-by: Caleb Connolly <caleb.connolly@linaro.org> # Qualcomm sdm845 Tested-by: Sam Edwards <CFSworks@gmail.com> # Binary output identical Signed-off-by: Ilias Apalodimas <ilias.apalodimas@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
35 lines
1.6 KiB
C
35 lines
1.6 KiB
C
// SPDX-License-Identifier: GPL-2.0+
|
|
/*
|
|
* Copyright 2013 Albert ARIBAUD <albert.u.boot@aribaud.net>
|
|
*/
|
|
#include <linux/compiler.h>
|
|
|
|
/**
|
|
* These two symbols are declared in a C file so that the linker
|
|
* uses R_ARM_RELATIVE relocation, rather than the R_ARM_ABS32 one
|
|
* it would use if the symbols were defined in the linker file.
|
|
* Using only R_ARM_RELATIVE relocation ensures that references to
|
|
* the symbols are correct after as well as before relocation.
|
|
*
|
|
* We need a 0-byte-size type for these symbols, and the compiler
|
|
* does not allow defining objects of C type 'void'. Using an empty
|
|
* struct is allowed by the compiler, but causes gcc versions 4.4 and
|
|
* below to complain about aliasing. Therefore we use the next best
|
|
* thing: zero-sized arrays, which are both 0-byte-size and exempt from
|
|
* aliasing warnings.
|
|
*/
|
|
|
|
char __image_copy_start[0] __section(".__image_copy_start");
|
|
char __image_copy_end[0] __section(".__image_copy_end");
|
|
char __rel_dyn_start[0] __section(".__rel_dyn_start");
|
|
char __rel_dyn_end[0] __section(".__rel_dyn_end");
|
|
char __secure_start[0] __section(".__secure_start");
|
|
char __secure_end[0] __section(".__secure_end");
|
|
char __secure_stack_start[0] __section(".__secure_stack_start");
|
|
char __secure_stack_end[0] __section(".__secure_stack_end");
|
|
char __efi_runtime_start[0] __section(".__efi_runtime_start");
|
|
char __efi_runtime_stop[0] __section(".__efi_runtime_stop");
|
|
char __efi_runtime_rel_start[0] __section(".__efi_runtime_rel_start");
|
|
char __efi_runtime_rel_stop[0] __section(".__efi_runtime_rel_stop");
|
|
char _end[0] __section(".__end");
|