arm: make __bss_start and __bss_end__ compiler-generated

Turn __bss_start and __bss_end__ from linker-generated
to compiler-generated symbols, causing relocations for
these symbols to change type, from R_ARM_ABS32 to
R_ARM_RELATIVE.

This should have no functional impact, as it affects
references to __bss_start and __bss_end__ only before
relocation, and no such references are done.

Signed-off-by: Albert ARIBAUD <albert.u.boot@aribaud.net>
This commit is contained in:
Albert ARIBAUD 2013-02-25 00:58:59 +00:00
parent 65cdd6430e
commit 3ebd1cbc49
9 changed files with 122 additions and 32 deletions

View File

@ -67,11 +67,17 @@ SECTIONS
_end = .; _end = .;
.bss __rel_dyn_start (OVERLAY) : { .bss_start __rel_dyn_start (OVERLAY) : {
__bss_start = .; KEEP(*(.__bss_start));
}
.bss __bss_start (OVERLAY) : {
*(.bss*) *(.bss*)
. = ALIGN(4); . = ALIGN(4);
__bss_end__ = .; ___bssend___ = .;
}
.bss_end ___bssend___ (OVERLAY) : {
KEEP(*(.__bss_end__));
} }
/DISCARD/ : { *(.dynstr*) } /DISCARD/ : { *(.dynstr*) }

View File

@ -81,11 +81,17 @@ SECTIONS
*(.mmutable) *(.mmutable)
} }
.bss __rel_dyn_start (OVERLAY) : { .bss_start __rel_dyn_start (OVERLAY) : {
__bss_start = .; KEEP(*(.__bss_start));
}
.bss __bss_start (OVERLAY) : {
*(.bss*) *(.bss*)
. = ALIGN(4); . = ALIGN(4);
__bss_end__ = .; ___bssend___ = .;
}
.bss_end ___bssend___ (OVERLAY) : {
KEEP(*(.__bss_end__));
} }
/DISCARD/ : { *(.dynstr*) } /DISCARD/ : { *(.dynstr*) }

View File

@ -39,6 +39,7 @@ GLCOBJS += div0.o
SOBJS-y += crt0.o SOBJS-y += crt0.o
ifndef CONFIG_SPL_BUILD ifndef CONFIG_SPL_BUILD
COBJS-y += bss.o
COBJS-y += board.o COBJS-y += board.o
COBJS-y += bootm.o COBJS-y += bootm.o
COBJS-$(CONFIG_SYS_L2_PL310) += cache-pl310.o COBJS-$(CONFIG_SYS_L2_PL310) += cache-pl310.o

39
arch/arm/lib/bss.c Normal file
View File

@ -0,0 +1,39 @@
/*
* Copyright 2013 Albert ARIBAUD <albert.u.boot@aribaud.net>
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
/**
* 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 __bss_start[0] __attribute__((used, section(".__bss_start")));
char __bss_end__[0] __attribute__((used, section(".__bss_end__")));

View File

@ -41,15 +41,15 @@ SECTIONS
*(.text*) *(.text*)
} }
. = ALIGN (4); . = ALIGN(4);
.rodata : { .rodata : {
*(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
} }
. = ALIGN (4); . = ALIGN(4);
.data : { .data : {
*(.data*) *(.data*)
} }
. = ALIGN (4); . = ALIGN(4);
.got : { .got : {
*(.got) *(.got)
} }
@ -72,13 +72,21 @@ SECTIONS
*(.dynsym) *(.dynsym)
} }
.bss __rel_dyn_start (OVERLAY) : { _end = .;
__bss_start = .;
.bss_start __rel_dyn_start (OVERLAY) : {
KEEP(*(.__bss_start));
}
.bss __bss_start (OVERLAY) : {
*(.bss*) *(.bss*)
. = ALIGN(4); . = ALIGN(4);
_end = .; ___bssend___ = .;
} }
__bss_end__ =.; .bss_end ___bssend___ (OVERLAY) : {
KEEP(*(.__bss_end__));
}
/DISCARD/ : { *(.dynstr*) } /DISCARD/ : { *(.dynstr*) }
/DISCARD/ : { *(.dynamic*) } /DISCARD/ : { *(.dynamic*) }
/DISCARD/ : { *(.plt*) } /DISCARD/ : { *(.plt*) }

View File

@ -41,15 +41,15 @@ SECTIONS
*(.text*) *(.text*)
} }
. = ALIGN (4); . = ALIGN(4);
.rodata : { .rodata : {
*(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
} }
. = ALIGN (4); . = ALIGN(4);
.data : { .data : {
*(.data*) *(.data*)
} }
. = ALIGN (4); . = ALIGN(4);
.got : { .got : {
*(.got) *(.got)
} }
@ -72,13 +72,21 @@ SECTIONS
*(.dynsym) *(.dynsym)
} }
.bss __rel_dyn_start (OVERLAY) : { _end = .;
__bss_start = .;
.bss_start __rel_dyn_start (OVERLAY) : {
KEEP(*(.__bss_start));
}
.bss __bss_start (OVERLAY) : {
*(.bss*) *(.bss*)
. = ALIGN(4); . = ALIGN(4);
_end = .; ___bssend___ = .;
} }
__bss_end__ =.; .bss_end ___bssend___ (OVERLAY) : {
KEEP(*(.__bss_end__));
}
/DISCARD/ : { *(.dynstr*) } /DISCARD/ : { *(.dynstr*) }
/DISCARD/ : { *(.dynamic*) } /DISCARD/ : { *(.dynamic*) }
/DISCARD/ : { *(.plt*) } /DISCARD/ : { *(.plt*) }

View File

@ -72,13 +72,21 @@ SECTIONS
*(.dynsym) *(.dynsym)
} }
.bss __rel_dyn_start (OVERLAY) : { _end = .;
__bss_start = .;
.bss_start __rel_dyn_start (OVERLAY) : {
KEEP(*(.__bss_start));
}
.bss __bss_start (OVERLAY) : {
*(.bss*) *(.bss*)
. = ALIGN(4); . = ALIGN(4);
_end = .; ___bssend___ = .;
} }
__bss_end__ =.; .bss_end ___bssend___ (OVERLAY) : {
KEEP(*(.__bss_end__));
}
/DISCARD/ : { *(.dynstr*) } /DISCARD/ : { *(.dynstr*) }
/DISCARD/ : { *(.dynamic*) } /DISCARD/ : { *(.dynamic*) }
/DISCARD/ : { *(.plt*) } /DISCARD/ : { *(.plt*) }

View File

@ -72,13 +72,21 @@ SECTIONS
*(.dynsym) *(.dynsym)
} }
.bss __rel_dyn_start (OVERLAY) : { _end = .;
__bss_start = .;
.bss_start __rel_dyn_start (OVERLAY) : {
KEEP(*(.__bss_start));
}
.bss __bss_start (OVERLAY) : {
*(.bss*) *(.bss*)
. = ALIGN(4); . = ALIGN(4);
_end = .; ___bssend___ = .;
} }
__bss_end__ =.; .bss_end ___bssend___ (OVERLAY) : {
KEEP(*(.__bss_end__));
}
/DISCARD/ : { *(.dynstr*) } /DISCARD/ : { *(.dynstr*) }
/DISCARD/ : { *(.dynamic*) } /DISCARD/ : { *(.dynamic*) }
/DISCARD/ : { *(.plt*) } /DISCARD/ : { *(.plt*) }

View File

@ -80,11 +80,17 @@ SECTIONS
_end = .; _end = .;
.bss __rel_dyn_start (OVERLAY) : { .bss_start __rel_dyn_start (OVERLAY) : {
__bss_start = .; KEEP(*(.__bss_start));
*(.bss) }
.bss __bss_start (OVERLAY) : {
*(.bss*)
. = ALIGN(4); . = ALIGN(4);
__bss_end__ = .; ___bssend___ = .;
}
.bss_end ___bssend___ (OVERLAY) : {
KEEP(*(.__bss_end__));
} }
/DISCARD/ : { *(.bss*) } /DISCARD/ : { *(.bss*) }