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

Albert ARIBAUD albert.u.boot at aribaud.net
Tue Feb 21 14:11:16 CET 2012


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

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


More information about the U-Boot mailing list