[U-Boot] [PATCH v3 6/7] arm: add a common .lds link script

Simon Glass sjg at chromium.org
Tue Feb 21 18:02:33 CET 2012


Hi Albert,

On Tue, Feb 21, 2012 at 5:11 AM, Albert ARIBAUD
<albert.u.boot at aribaud.net> wrote:
> 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

OK will do

>
>
>> __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 Glass<sjg at 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 at 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.

OK, but realistically we copy a word at a time (at least) and the
.rel.dyn region is going to be word-aligned I think. All we are doing
here is making sure that the image ends on a word boundary, which
seems reasonable to me.

In other words, I would like the __image_copy_start and
__image_copy_end symbols to be word-aligned.

>
>
>> +       __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.

Yes it will be 16KB, although of course only if it exists. At present
it is only used for pxa so including it here allows pxa boards to
build.

The hole is not in the middle of the binary, but at the end. The BSS
may overlay it if large enough, but that doesn't take affect until
after relocation.

I'm not thrilled with it either, but it does allow us to have an
option to set up the MMU table at compile time for those that need it.
Having thought about it a bit more I feel that we should be able to
set this up at run-time instead, but still, it is needed at present
for pxa, so...

I have question also, for Marek. Should this be 16KB aligned, since
ARM needs this I think. The alignment is currently provided by pxa's
start.S but we might as well be explicit here I think.

>
>
>> +       .bss __rel_dyn_start (OVERLAY) : {
>> +               __bss_start = .;
>> +               *(.bss)
>> +                . = ALIGN(4);
>> +               __bss_end__ = .;
>> +       }
>> +
>> +       /DISCARD/ : { *(.dynstr*) }
>> +       /DISCARD/ : { *(.dynamic*) }
>> +       /DISCARD/ : { *(.plt*) }
>> +       /DISCARD/ : { *(.interp*) }
>> +       /DISCARD/ : { *(.gnu*) }
>> +}
>
>
> Amicalement,
> --
> Albert.

Regards,
Simon


More information about the U-Boot mailing list