
Hi Simon,
Le 21/02/2012 07:17, Simon Glass a écrit :
Most ARM CPUs use a very similar link script. This adds a basic script that can be used by most CPUs.
Two new symbols are introduced which are intended to eventually be defined on all architectures to make things easier for generic relocation and reduce special-case code for each architecture:
__text_start is the start of the text area (equivalent to the existing _start on ARM). It marks the start of the region which must be copied to a new location during relocation.
Please name it _image_copy_start, not __text_start
__image_copy_end is the end of the region which must be copied to a new location during relocation. It is normally equal to the start of the BSS region, but this can vary in some cases (SPL?). Making this an explicit symbol on its own removes any ambiguity and permits common code to always do the right thing.
This new script makes use of CPUDIR, now defined by both Makefile and spl/Makefile, to find the directory containing the start.o object file, which is always placed first in the image.
To permit MMU setup prior to relocation (as used by pxa) we add an area to the link script which contains space for this. This is taken from commit 7f4cfcf. CPUs can put the contents in there using their start.S file. BTW, shouldn't that area be 16KB-aligned?
Signed-off-by: Simon Glasssjg@chromium.org
Changes in v3:
Add more comments in the commit message
Add section for MMU area, as required by pxa
arch/arm/cpu/u-boot.lds | 91 +++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 91 insertions(+), 0 deletions(-) create mode 100644 arch/arm/cpu/u-boot.lds
diff --git a/arch/arm/cpu/u-boot.lds b/arch/arm/cpu/u-boot.lds new file mode 100644 index 0000000..7a859fc --- /dev/null +++ b/arch/arm/cpu/u-boot.lds @@ -0,0 +1,91 @@ +/*
- Copyright (c) 2004-2008 Texas Instruments
- (C) Copyright 2002
- Gary Jennejohn, DENX Software Engineering,garyj@denx.de
- 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
- */
+OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") +OUTPUT_ARCH(arm) +ENTRY(_start) +SECTIONS +{
- . = 0x00000000;
- . = ALIGN(4);
- .text :
- {
__text_start = .;
CPUDIR/start.o (.text)
*(.text)
- }
- . = ALIGN(4);
- .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
- . = ALIGN(4);
- .data : {
*(.data)
- }
- . = ALIGN(4);
- . = .;
- __u_boot_cmd_start = .;
- .u_boot_cmd : { *(.u_boot_cmd) }
- __u_boot_cmd_end = .;
- . = ALIGN(4);
This "ALIGN(4)" is what upsets my edminiv2 build and makes it not binary-identical. It is not in the current arm926ejs liner script. I will check if adding it to the current arm926ejs script produces a working and binary-identical u-boot.
- __image_copy_end = .;
- .rel.dyn : {
__rel_dyn_start = .;
*(.rel*)
__rel_dyn_end = .;
- }
- .dynsym : {
__dynsym_start = .;
*(.dynsym)
- }
- _end = .;
Below is what I assume to be the reservation for MMU.
- . = ALIGN(4096);
- .mmutable : {
*(.mmutable)
- }
... and I don't like it at all, more so if it is going to be actually 16 KB, because it seems to me we're wasting memory and creating a hole in the middle of our in-RAM binary, and I'm not sure we need to do it here in the first place. Do we need to have that MMU region mapped over DDR? And if so, do we need to have it mapped in the middle of u-boot? Plus you're placing it after .dynsym and .rel.dyn, but possibly overlaid with .bss. Normally this area should have gone by the time we get to use BSS, but assumption is the mother of all screw-ups.
- .bss __rel_dyn_start (OVERLAY) : {
__bss_start = .;
*(.bss)
. = ALIGN(4);
__bss_end__ = .;
- }
- /DISCARD/ : { *(.dynstr*) }
- /DISCARD/ : { *(.dynamic*) }
- /DISCARD/ : { *(.plt*) }
- /DISCARD/ : { *(.interp*) }
- /DISCARD/ : { *(.gnu*) }
+}
Amicalement,