arm: add a common .lds link script
PATCH v3 6/7 arm: add a common .lds link script
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.
__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?
---
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
arch/arm/cpu/u-boot.lds new file +91 -0
@@ -0,0 +1,91 @@ +/* + * Copyright (c) 2004-2008 Texas Instruments + * + * (C) Copyright 2002 + * Gary Jennejohn, DENX Software Engineering, <[email protected]> + * + * 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); + + __image_copy_end = .; + + .rel.dyn : { + __rel_dyn_start = .; + *(.rel*) + __rel_dyn_end = .; + } + + .dynsym : { + __dynsym_start = .; + *(.dynsym) + } + + _end = .; + + . = ALIGN(4096); + + .mmutable : { + *(.mmutable) + } + + .bss __rel_dyn_start (OVERLAY) : { + __bss_start = .; + *(.bss) + . = ALIGN(4); + __bss_end__ = .; + } + + /DISCARD/ : { *(.dynstr*) } + /DISCARD/ : { *(.dynamic*) } + /DISCARD/ : { *(.plt*) } + /DISCARD/ : { *(.interp*) } + /DISCARD/ : { *(.gnu*) } +}
Signature · 1 line
1.7.7.3
PATCH v3 7/7 arm: Use common .lds file where possible
Each cpu directory currently has its own .lds file. This is only needed in most cases because the start.o file is in a different subdir.
Now that we can factor out this difference, we can move most cpus over to the common .lds file.
---
Changes in v3:
- Rebase to master
arch/arm/cpu/arm1136/u-boot.lds | 89 ------------------------------------- arch/arm/cpu/arm1176/u-boot.lds | 78 -------------------------------- arch/arm/cpu/arm720t/u-boot.lds | 79 -------------------------------- arch/arm/cpu/arm920t/u-boot.lds | 88 ------------------------------------ arch/arm/cpu/arm925t/u-boot.lds | 83 ---------------------------------- arch/arm/cpu/arm926ejs/u-boot.lds | 80 --------------------------------- arch/arm/cpu/arm946es/u-boot.lds | 80 --------------------------------- arch/arm/cpu/arm_intcm/u-boot.lds | 80 --------------------------------- arch/arm/cpu/armv7/u-boot.lds | 85 ----------------------------------- arch/arm/cpu/lh7a40x/u-boot.lds | 80 --------------------------------- arch/arm/cpu/pxa/u-boot.lds | 86 ----------------------------------- arch/arm/cpu/s3c44b0/u-boot.lds | 80 --------------------------------- arch/arm/cpu/sa1100/u-boot.lds | 83 ---------------------------------- 13 files changed, 0 insertions(+), 1071 deletions(-) delete mode 100644 arch/arm/cpu/arm1136/u-boot.lds delete mode 100644 arch/arm/cpu/arm1176/u-boot.lds delete mode 100644 arch/arm/cpu/arm720t/u-boot.lds delete mode 100644 arch/arm/cpu/arm920t/u-boot.lds delete mode 100644 arch/arm/cpu/arm925t/u-boot.lds delete mode 100644 arch/arm/cpu/arm926ejs/u-boot.lds delete mode 100644 arch/arm/cpu/arm946es/u-boot.lds delete mode 100644 arch/arm/cpu/arm_intcm/u-boot.lds delete mode 100644 arch/arm/cpu/armv7/u-boot.lds delete mode 100644 arch/arm/cpu/lh7a40x/u-boot.lds delete mode 100644 arch/arm/cpu/pxa/u-boot.lds delete mode 100644 arch/arm/cpu/s3c44b0/u-boot.lds delete mode 100644 arch/arm/cpu/sa1100/u-boot.lds
arch/arm/cpu/arm1136/u-boot.lds deleted +0 -89
@@ -1,89 +0,0 @@ -/* - * (C) Copyright 2009 - * Ilya Yanok, Emcraft Systems Ltd, <[email protected]> - * - * Copyright (C) 2005-2007 Samsung Electronics - * Kyungin Park <[email protected]> - * - * Copyright (c) 2004 Texas Instruments - * - * (C) Copyright 2002 - * Gary Jennejohn, DENX Software Engineering, <[email protected]> - * - * 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 : - { - arch/arm/cpu/arm1136/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); - - .rel.dyn : { - __rel_dyn_start = .; - *(.rel*) - __rel_dyn_end = .; - } - - .dynsym : { - __dynsym_start = .; - *(.dynsym) - } - - _end = .; - - .bss __rel_dyn_start (OVERLAY) : { - __bss_start = .; - *(.bss) - . = ALIGN(4); - __bss_end__ = .; - } - - /DISCARD/ : { *(.dynstr*) } - /DISCARD/ : { *(.dynamic*) } - /DISCARD/ : { *(.plt*) } - /DISCARD/ : { *(.interp*) } - /DISCARD/ : { *(.gnu*) } -}
arch/arm/cpu/arm1176/u-boot.lds deleted +0 -78
78 lines not on this page · raw message
arch/arm/cpu/arm720t/u-boot.lds deleted +0 -79
79 lines not on this page · raw message
arch/arm/cpu/arm920t/u-boot.lds deleted +0 -88
88 lines not on this page · raw message
arch/arm/cpu/arm925t/u-boot.lds deleted +0 -83
83 lines not on this page · raw message
arch/arm/cpu/arm926ejs/u-boot.lds deleted +0 -80
80 lines not on this page · raw message
arch/arm/cpu/arm946es/u-boot.lds deleted +0 -80
80 lines not on this page · raw message
arch/arm/cpu/arm_intcm/u-boot.lds deleted +0 -80
80 lines not on this page · raw message
arch/arm/cpu/armv7/u-boot.lds deleted +0 -85
85 lines not on this page · raw message
arch/arm/cpu/lh7a40x/u-boot.lds deleted +0 -80
80 lines not on this page · raw message
arch/arm/cpu/pxa/u-boot.lds deleted +0 -86
86 lines not on this page · raw message
arch/arm/cpu/s3c44b0/u-boot.lds deleted +0 -80
80 lines not on this page · raw message
arch/arm/cpu/sa1100/u-boot.lds deleted +0 -83
83 lines not on this page · raw message
Signature · 1 line
1.7.7.3
PATCH v3 6/7 arm: add a common .lds link script
In reply to Simon GlassHi Simon,
Le 21/02/2012 07:17, Simon Glass a ?crit :
Quoted 10 lines
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_startis the start of the text area (equivalent to the existing_starton 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
Quoted 77 lines
__image_copy_endis 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
Makefileand 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.Sfile. BTW, shouldn't that area be 16KB-aligned?Signed-off-by Simon Glass<[email protected]>---
Changes in v3:
- Add more comments in the commit message
- Add section for MMU area, as required by pxaarch/arm/cpu/u-boot.lds | 91 +++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 91 insertions(+), 0 deletions(-)create mode 100644
arch/arm/cpu/u-boot.ldsarch/arm/cpu/u-boot.lds new file +46
-0@@ -0,0 +1,91 @@ +/* + * Copyright (c) 2004-2008 Texas Instruments + * + * (C) Copyright 2002 + * Gary Jennejohn, DENX Software Engineering,<[email protected]> + * + * 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)
arch/arm/cpu/u-boot.lds line 56
Quoted 10 lines
arch/arm/cpu/u-boot.lds new file +10
-0+ } + + . = 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.
Quoted 4 lines
arch/arm/cpu/u-boot.lds new file +4
-0+ __image_copy_end = .; + + .rel.dyn : { + __rel_dyn_start = .;
arch/arm/cpu/u-boot.lds line 71
Quoted 10 lines
arch/arm/cpu/u-boot.lds new file +10
-0+ *(.rel*) + __rel_dyn_end = .; + } + + .dynsym : { + __dynsym_start = .; + *(.dynsym) + } + + _end = .;
Below is what I assume to be the reservation for MMU.
arch/arm/cpu/u-boot.lds line 77
Quoted 5 lines
arch/arm/cpu/u-boot.lds new file +5
-0+ . = 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.
arch/arm/cpu/u-boot.lds line 91
Quoted 13 lines
arch/arm/cpu/u-boot.lds new file +13
-0+ .bss __rel_dyn_start (OVERLAY) : { + __bss_start = .; + *(.bss) + . = ALIGN(4); + __bss_end__ = .; + } + + /DISCARD/ : { *(.dynstr*) } + /DISCARD/ : { *(.dynamic*) } + /DISCARD/ : { *(.plt*) } + /DISCARD/ : { *(.interp*) } + /DISCARD/ : { *(.gnu*) } +}
Amicalement,
Signature · 1 line
Albert.
PATCH v3 6/7 arm: add a common .lds link script
Hi again Simon,
Le 21/02/2012 14:11, Albert ARIBAUD a ?crit :
Quoted 9 lines
Quoted 7 lines
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_startis the start of the text area (equivalent to the existing_starton 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
Also, I realize this introduces two symbols which are not used within the same patch set.
Amicalement,
Signature · 1 line
Albert.
PATCH v3 6/7 arm: add a common .lds link script
In reply to Albert ARIBAUDHi Albert,
Quoted 11 lines · Albert ARIBAUD
Hi Simon,
Le 21/02/2012 07:17, Simon Glass a ?crit :
Quoted 7 lines
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:
Quoted 6 lines
Quoted 3 lines
__text_startis the start of the text area (equivalent to the existing_starton 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
Quoted 88 lines
Quoted 88 lines
__image_copy_endis 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
Makefileand 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.Sfile. BTW, shouldn't that area be 16KB-aligned?Signed-off-by Simon Glass<[email protected]>---
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 100644arch/arm/cpu/u-boot.ldsarch/arm/cpu/u-boot.lds new file +54
-0@@ -0,0 +1,91 @@ +/* + * Copyright (c) 2004-2008 Texas Instruments + * + * (C) Copyright 2002 + * Gary Jennejohn, DENX Software Engineering,<[email protected]> + * + * 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 = .;
Quoted 8 lines
arch/arm/cpu/u-boot.lds line 56
Quoted 2 lines
arch/arm/cpu/u-boot.lds new file +2
-0+ + ? ? ? . = 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.
Quoted 28 lines
Quoted 6 lines
arch/arm/cpu/u-boot.lds new file +4
-0+ ? ? ? __image_copy_end = .; + + ? ? ? .rel.dyn : { + ? ? ? ? ? ? ? __rel_dyn_start = .;arch/arm/cpu/u-boot.lds line 70
Quoted 10 lines
arch/arm/cpu/u-boot.lds new file +10
-0+ ? ? ? ? ? ? ? *(.rel*) + ? ? ? ? ? ? ? __rel_dyn_end = .; + ? ? ? } + + ? ? ? .dynsym : { + ? ? ? ? ? ? ? __dynsym_start = .; + ? ? ? ? ? ? ? *(.dynsym) + ? ? ? } + + ? ? ? _end = .;Below is what I assume to be the reservation for MMU.
arch/arm/cpu/u-boot.lds line 75
Quoted 5 lines
arch/arm/cpu/u-boot.lds new file +5
-0+ ? ? ? . = ALIGN(4096); + + ? ? ? .mmutable : { + ? ? ? ? ? ? ? *(.mmutable) + ? ? ? }
Quoted 8 lines
... 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.
Quoted 12 lines
Quoted 12 lines
arch/arm/cpu/u-boot.lds new file +10
-0+ ? ? ? .bss __rel_dyn_start (OVERLAY) : { + ? ? ? ? ? ? ? __bss_start = .; + ? ? ? ? ? ? ? *(.bss) + ? ? ? ? ? ? ? ?. = ALIGN(4); + ? ? ? ? ? ? ? __bss_end__ = .; + ? ? ? } + + ? ? ? /DISCARD/ : { *(.dynstr*) } + ? ? ? /DISCARD/ : { *(.dynamic*) } + ? ? ? /DISCARD/ : { *(.plt*) }
Quoted 8 lines
arch/arm/cpu/u-boot.lds line 88
Quoted 3 lines
arch/arm/cpu/u-boot.lds new file +3
-0+ ? ? ? /DISCARD/ : { *(.interp*) } + ? ? ? /DISCARD/ : { *(.gnu*) } +}Amicalement,
--
Albert.
Regards,
Simon
PATCH v3 6/7 arm: add a common .lds link script
Hi Simon,
Le 21/02/2012 18:02, Simon Glass a ?crit :
Quoted 8 lines
Quoted 7 lines
Quoted 1 line
+ . = 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.
Quoted 7 lines
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_startand__image_copy_endsymbols to be word-aligned.
I understand the requirement and agree to it -- only, it seems to me it is already fulfilled in the current lds files, so I still fail to see what breaks 'near binary identity'.
Amicalement,
Signature · 1 line
Albert.
PATCH v3 6/7 arm: add a common .lds link script
Hi Albert,
Quoted 20 lines · Albert ARIBAUD
Hi Simon,
Le 21/02/2012 18:02, Simon Glass a ?crit :
Quoted 15 lines
Quoted 8 lines
Quoted 1 line
+ ? ? ? . = 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.
Quoted 7 lines
Quoted 2 lines
In other words, I would like the
__image_copy_startand__image_copy_endsymbols to be word-aligned.I understand the requirement and agree to it -- only, it seems to me it is already fulfilled in the current lds files, so I still fail to see what breaks 'near binary identity'.
If we add any symbols or change the value of any of them, then the binary file may change. You can see the differences by doing something like:
armv7a-cros-linux-gnueabi-objdump -b binary -m arm -D u-boot.bin
on each file (but I guess you know that).
Quoted 4 lines
Amicalement,
--
Albert.
Regards,
Simon
A message that is not in the archive (sent off-list or not yet received): [email protected]
PATCH v3 6/7 arm: add a common .lds link script
Hi Albert,
Quoted 50 lines · Albert ARIBAUD
Hi Simon,
Le 21/02/2012 21:14, Simon Glass a ?crit :
Quoted 42 lines
Hi Albert,
Quoted 30 lines · On Tue, Feb 21, 2012 at 11:52 AM, Albert ARIBAUD <[email protected]>…
Hi Simon,
Le 21/02/2012 18:02, Simon Glass a ?crit :
Quoted 14 lines
Quoted 11 lines
Quoted 1 line
+ ? ? ? . = 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.Quoted 7 lines
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_startand__image_copy_endsymbols to be word-aligned.Quoted 4 lines
I understand the requirement and agree to it -- only, it seems to me it is
already fulfilled in the current lds files, so I still fail to see what breaks 'near binary identity'.Quoted 3 lines
If we add any symbols or change the value of any of them, then the binary file may change. You can see the differences by doing something like:
Quoted 5 lines
This statement is true in a very general fashion, but becomes false for many cases, including the one where the symbol is added at link stage and not referenced in the build, which is the case for edminiv2. Then the ELF file's symbol sections may change, but the .text and .data sections have no reason to.
I agree with that. But do you see this behaviour? I did initially, until I realized that it was just that '-dirty' was be appended to the version string, which was increasing the .rodata size and just changing all the offsets in the text section. Once I committed the change and rebuilt, the problem went away.
Please can you confirm what differences you are seeing with things like:
armv7a-cros-linux-gnueabi-objdump -h u-boot
armv7a-cros-linux-gnueabi-objdump -t u-boot
armv7a-cros-linux-gnueabi-objdump -d u-boot
...
Quoted 3 lines
Plus, you did not address my note that the current .lds already aligns the start and end of copy section to a multiple of 4.
I think I missed that comment. I saw that you said that the ALIGN before __image_copy_end was not in the arm926-ejs link script, but when I looked I did in fact see it, e.g. in e37ae40:
arch/arm/cpu/arm926ejs/u-boot.lds:
...
. = .;
__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;
. = ALIGN(4);
^^^^^^^^^^^^^
.rel.dyn : {...
In the link script in this patch I have:
. = ALIGN(4);
. = .;
__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;
. = ALIGN(4);
__image_copy_end = .;
.rel.dyn : {
__rel_dyn_start = .;Granted, the last ALIGN should not be needed since the size of commands should be word-aligned anyway, and the first command is clearly word-aligned, but it does make things clear I think. Can you please explain more what you mean by ' the current .lds already aligns the start and end of copy section to a multiple of 4'. And also, how you would like me to change this patch. Just remove the last ALIGN?
Quoted 10 lines
Quoted 5 lines
armv7a-cros-linux-gnueabi-objdump -b binary -m arm -D u-boot.bin
on each file (but I guess you know that).
Yes, plus 'od -t x1z -A x u-boot.bin > u-boot.lst' :) and it does not explain why the .text and .data sections should undergo any change when the .lds introduces a symbol that neither section references.
See my note above about 'dirty', but if you are saying it is due to the ALIGN, I am not sure what to say. I don't see that, so perhaps it is best to email the commands you are using so I can replicate.
Regards,
Smion
Quoted 9 lines
Quoted 4 lines
Regards,
SimonAmicalement,
--
Albert.
PATCH v3 6/7 arm: add a common .lds link script
In reply to Simon GlassQuoted 171 lines
Hi Albert,
On Tue, Feb 21, 2012 at 5:11 AM, Albert ARIBAUD
Quoted 10 lines · <[email protected]> wrote:
Hi Simon,
Le 21/02/2012 07:17, Simon Glass a ?crit :
Quoted 7 lines
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:
Quoted 5 lines
Quoted 3 lines
__text_startis the start of the text area (equivalent to the existing_starton 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_startOK will do
Quoted 85 lines
Quoted 85 lines
__image_copy_endis 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
Makefileand 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.Sfile. BTW, shouldn't that area be 16KB-aligned?Signed-off-by Simon Glass<[email protected]>---
Changes in v3:
- Add more comments in the commit message
- Add section for MMU area, as required by pxaarch/arm/cpu/u-boot.lds | 91 +++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 91 insertions(+), 0 deletions(-) create mode 100644 arch/arm/cpu/u-boot.ldsarch/arm/cpu/u-boot.lds new file +53
-0@@ -0,0 +1,91 @@ +/* + * Copyright (c) 2004-2008 Texas Instruments + * + * (C) Copyright 2002 + * Gary Jennejohn, DENX Software Engineering,<[email protected]> + * + * 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) }Quoted 8 lines
arch/arm/cpu/u-boot.lds line 56
Quoted 3 lines
arch/arm/cpu/u-boot.lds new file +3
-0+ __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_startand__image_copy_endsymbols to be word-aligned.Quoted 23 lines
Quoted 4 lines
arch/arm/cpu/u-boot.lds new file +4
-0+ __image_copy_end = .; + + .rel.dyn : { + __rel_dyn_start = .;arch/arm/cpu/u-boot.lds line 71
Quoted 10 lines
arch/arm/cpu/u-boot.lds new file +10
-0+ *(.rel*) + __rel_dyn_end = .; + } + + .dynsym : { + __dynsym_start = .; + *(.dynsym) + } + + _end = .;Below is what I assume to be the reservation for MMU.
arch/arm/cpu/u-boot.lds line 77
Quoted 5 lines
arch/arm/cpu/u-boot.lds new file +5
-0+ . = ALIGN(4096); + + .mmutable : { + *(.mmutable) + }Quoted 8 lines
... 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...
Quoted 3 lines
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.Sbut we might as well be explicit here I think.
Yes, but I believe it should be only 4k aligned. This part is special in more ways actually.
This is only used on PXA250, since that has no SRAM and therefore no place for stack at boottime. But to allow locking cachelines (to create space for stack) we need the MMU table ready. Therefore I created the MMU table with 1:1 mapping in the ROM at compile time and in the init code I point the MMU to this table.
That's about it
M
Quoted 21 lines
Quoted 10 lines
Quoted 10 lines
arch/arm/cpu/u-boot.lds new file +9
-0+ .bss __rel_dyn_start (OVERLAY) : { + __bss_start = .; + *(.bss) + . = ALIGN(4); + __bss_end__ = .; + } + + /DISCARD/ : { *(.dynstr*) } + /DISCARD/ : { *(.dynamic*) }Quoted 8 lines
arch/arm/cpu/u-boot.lds line 91
Quoted 4 lines
arch/arm/cpu/u-boot.lds new file +4
-0+ /DISCARD/ : { *(.plt*) } + /DISCARD/ : { *(.interp*) } + /DISCARD/ : { *(.gnu*) } +}Amicalement,
--
Albert.Regards,
Simon
PATCH v3 6/7 arm: add a common .lds link script
Hi Marek,
Quoted 178 lines · Marek Vasut
Quoted 171 lines
Hi Albert,
On Tue, Feb 21, 2012 at 5:11 AM, Albert ARIBAUD
Quoted 10 lines · <[email protected]> wrote:
Hi Simon,
Le 21/02/2012 07:17, Simon Glass a ?crit :
Quoted 7 lines
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:
Quoted 5 lines
Quoted 3 lines
__text_startis the start of the text area (equivalent to the existing_starton 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_startOK will do
Quoted 85 lines
Quoted 85 lines
__image_copy_endis 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
Makefileand 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.Sfile. BTW, shouldn't that area be 16KB-aligned?Signed-off-by Simon Glass<[email protected]>---
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 100644arch/arm/cpu/u-boot.ldsarch/arm/cpu/u-boot.lds new file +53
-0@@ -0,0 +1,91 @@ +/* + * Copyright (c) 2004-2008 Texas Instruments + * + * (C) Copyright 2002 + * Gary Jennejohn, DENX Software Engineering,<[email protected]> + * + * 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) }Quoted 8 lines
arch/arm/cpu/u-boot.lds line 56
Quoted 3 lines
arch/arm/cpu/u-boot.lds new file +3
-0+ ? ? ? __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_startand__image_copy_endsymbols to be word-aligned.Quoted 23 lines
Quoted 4 lines
arch/arm/cpu/u-boot.lds new file +4
-0+ ? ? ? __image_copy_end = .; + + ? ? ? .rel.dyn : { + ? ? ? ? ? ? ? __rel_dyn_start = .;arch/arm/cpu/u-boot.lds line 70
Quoted 10 lines
arch/arm/cpu/u-boot.lds new file +10
-0+ ? ? ? ? ? ? ? *(.rel*) + ? ? ? ? ? ? ? __rel_dyn_end = .; + ? ? ? } + + ? ? ? .dynsym : { + ? ? ? ? ? ? ? __dynsym_start = .; + ? ? ? ? ? ? ? *(.dynsym) + ? ? ? } + + ? ? ? _end = .;Below is what I assume to be the reservation for MMU.
arch/arm/cpu/u-boot.lds line 75
Quoted 5 lines
arch/arm/cpu/u-boot.lds new file +5
-0+ ? ? ? . = ALIGN(4096); + + ? ? ? .mmutable : { + ? ? ? ? ? ? ? *(.mmutable) + ? ? ? }Quoted 8 lines
... 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...
Quoted 3 lines
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.Sbut we might as well be explicit here I think.Yes, but I believe it should be only 4k aligned. This part is special in more ways actually.
Quoted 6 lines
This is only used on PXA250, since that has no SRAM and therefore no place for stack at boottime. But to allow locking cachelines (to create space for stack) we need the MMU table ready. Therefore I created the MMU table with 1:1 mapping in the ROM at compile time and in the init code I point the MMU to this table.
That's about it
OK thank you. Since this isn't needed for other CPUs and given Albert's concerns I will mark this section as deprecated in my v4 patch, just to make sure others don't start using it.
Quoted 2 lines
M
Regards,
Simon
Quoted 22 lines
Quoted 22 lines
Quoted 11 lines
Quoted 11 lines
arch/arm/cpu/u-boot.lds new file +9
-0+ ? ? ? .bss __rel_dyn_start (OVERLAY) : { + ? ? ? ? ? ? ? __bss_start = .; + ? ? ? ? ? ? ? *(.bss) + ? ? ? ? ? ? ? ?. = ALIGN(4); + ? ? ? ? ? ? ? __bss_end__ = .; + ? ? ? } + + ? ? ? /DISCARD/ : { *(.dynstr*) } + ? ? ? /DISCARD/ : { *(.dynamic*) }Quoted 8 lines
arch/arm/cpu/u-boot.lds line 88
Quoted 4 lines
arch/arm/cpu/u-boot.lds new file +4
-0+ ? ? ? /DISCARD/ : { *(.plt*) } + ? ? ? /DISCARD/ : { *(.interp*) } + ? ? ? /DISCARD/ : { *(.gnu*) } +}Amicalement,
--
Albert.Regards,
Simon