diff mbox

[U-Boot,v1] Refactor linker-generated arrays

Message ID 1359824574-32627-2-git-send-email-albert.u.boot@aribaud.net
State RFC
Delegated to: Albert ARIBAUD
Headers show

Commit Message

Albert ARIBAUD Feb. 2, 2013, 5:02 p.m. UTC
Refactor linker-generated array code so that symbols
which were previously linker-generated are now compiler-
generated. This causes relocation records of type
R_ARM_ABS32 to become R_ARM_RELATIVE, which makes
code which uses LGA able to run before relocation as
well as after.

Note: this affects more than ARM targets, as linker-
lists span possibly all target architectures, notably
PowerPC.

Signed-off-by: Albert ARIBAUD <albert.u.boot@aribaud.net>
---
 Makefile                                         |    6 +-
 arch/arm/cpu/arm920t/ep93xx/u-boot.lds           |    2 +-
 arch/arm/cpu/arm926ejs/mxs/u-boot-spl.lds        |    2 +-
 arch/arm/cpu/arm926ejs/spear/u-boot-spl.lds      |    2 +-
 arch/arm/cpu/armv7/omap-common/u-boot-spl.lds    |    2 +-
 arch/arm/cpu/ixp/u-boot.lds                      |    2 +-
 arch/arm/cpu/u-boot.lds                          |    2 +-
 arch/avr32/cpu/u-boot.lds                        |    2 +-
 arch/blackfin/cpu/u-boot.lds                     |    2 +-
 arch/microblaze/cpu/u-boot.lds                   |    2 +-
 arch/mips/cpu/u-boot.lds                         |    2 +-
 arch/nds32/cpu/n1213/u-boot.lds                  |    2 +-
 arch/nios2/cpu/u-boot.lds                        |    2 +-
 arch/powerpc/cpu/74xx_7xx/u-boot.lds             |    2 +-
 arch/powerpc/cpu/mpc512x/u-boot.lds              |    2 +-
 arch/powerpc/cpu/mpc5xx/u-boot.lds               |    2 +-
 arch/powerpc/cpu/mpc5xxx/u-boot-customlayout.lds |    2 +-
 arch/powerpc/cpu/mpc5xxx/u-boot.lds              |    2 +-
 arch/powerpc/cpu/mpc8220/u-boot.lds              |    2 +-
 arch/powerpc/cpu/mpc824x/u-boot.lds              |    2 +-
 arch/powerpc/cpu/mpc8260/u-boot.lds              |    2 +-
 arch/powerpc/cpu/mpc83xx/u-boot.lds              |    2 +-
 arch/powerpc/cpu/mpc85xx/u-boot-nand.lds         |    2 +-
 arch/powerpc/cpu/mpc85xx/u-boot-nand_spl.lds     |    2 +-
 arch/powerpc/cpu/mpc85xx/u-boot.lds              |    2 +-
 arch/powerpc/cpu/mpc86xx/u-boot.lds              |    2 +-
 arch/powerpc/cpu/ppc4xx/u-boot.lds               |    2 +-
 arch/sandbox/cpu/u-boot.lds                      |    2 +-
 arch/sh/cpu/sh2/u-boot.lds                       |    2 +-
 arch/sh/cpu/sh3/u-boot.lds                       |    2 +-
 arch/sh/cpu/sh4/u-boot.lds                       |    2 +-
 arch/x86/cpu/u-boot.lds                          |    2 +-
 board/BuS/eb_cpu5282/u-boot.lds                  |    2 +-
 board/LEOX/elpt860/u-boot.lds                    |    2 +-
 board/RPXClassic/u-boot.lds                      |    2 +-
 board/RPXlite/u-boot.lds                         |    2 +-
 board/RPXlite_dw/u-boot.lds                      |    2 +-
 board/RRvision/u-boot.lds                        |    2 +-
 board/actux1/u-boot.lds                          |    2 +-
 board/actux2/u-boot.lds                          |    2 +-
 board/actux3/u-boot.lds                          |    2 +-
 board/adder/u-boot.lds                           |    2 +-
 board/ait/cam_enc_4xx/u-boot-spl.lds             |    2 +-
 board/altera/nios2-generic/u-boot.lds            |    2 +-
 board/amcc/acadia/u-boot-nand.lds                |    2 +-
 board/amcc/bamboo/u-boot-nand.lds                |    2 +-
 board/amcc/canyonlands/u-boot-nand.lds           |    2 +-
 board/amcc/kilauea/u-boot-nand.lds               |    2 +-
 board/amcc/sequoia/u-boot-nand.lds               |    2 +-
 board/amcc/sequoia/u-boot-ram.lds                |    2 +-
 board/astro/mcf5373l/u-boot.lds                  |    2 +-
 board/cobra5272/u-boot.lds                       |    2 +-
 board/cogent/u-boot.lds                          |    2 +-
 board/dave/PPChameleonEVB/u-boot.lds             |    2 +-
 board/davinci/da8xxevm/u-boot-spl-da850evm.lds   |    2 +-
 board/davinci/da8xxevm/u-boot-spl-hawk.lds       |    2 +-
 board/dvlhost/u-boot.lds                         |    2 +-
 board/eltec/mhpc/u-boot.lds                      |    2 +-
 board/emk/top860/u-boot.lds                      |    2 +-
 board/ep88x/u-boot.lds                           |    2 +-
 board/esd/dasa_sim/u-boot.lds                    |    2 +-
 board/esd/pmc440/u-boot-nand.lds                 |    2 +-
 board/esd/tasreg/u-boot.lds                      |    2 +-
 board/esteem192e/u-boot.lds                      |    2 +-
 board/evb64260/u-boot.lds                        |    2 +-
 board/fads/u-boot.lds                            |    2 +-
 board/flagadm/u-boot.lds                         |    2 +-
 board/freescale/m5208evbe/u-boot.lds             |    2 +-
 board/freescale/m52277evb/u-boot.lds             |    2 +-
 board/freescale/m5235evb/u-boot.lds              |    2 +-
 board/freescale/m5249evb/u-boot.lds              |    2 +-
 board/freescale/m5253demo/u-boot.lds             |    2 +-
 board/freescale/m5253evbe/u-boot.lds             |    2 +-
 board/freescale/m5271evb/u-boot.lds              |    2 +-
 board/freescale/m5272c3/u-boot.lds               |    2 +-
 board/freescale/m5275evb/u-boot.lds              |    2 +-
 board/freescale/m5282evb/u-boot.lds              |    2 +-
 board/freescale/m53017evb/u-boot.lds             |    2 +-
 board/freescale/m5329evb/u-boot.lds              |    2 +-
 board/freescale/m5373evb/u-boot.lds              |    2 +-
 board/freescale/m54418twr/u-boot.lds             |    2 +-
 board/freescale/m54451evb/u-boot.lds             |    2 +-
 board/freescale/m54455evb/u-boot.lds             |    2 +-
 board/freescale/m547xevb/u-boot.lds              |    2 +-
 board/freescale/m548xevb/u-boot.lds              |    2 +-
 board/freescale/mx31ads/u-boot.lds               |    2 +-
 board/gaisler/gr_cpci_ax2000/u-boot.lds          |    2 +-
 board/gaisler/gr_ep2s60/u-boot.lds               |    2 +-
 board/gaisler/gr_xc3s_1500/u-boot.lds            |    2 +-
 board/gaisler/grsim/u-boot.lds                   |    2 +-
 board/gaisler/grsim_leon2/u-boot.lds             |    2 +-
 board/gen860t/u-boot-flashenv.lds                |    2 +-
 board/gen860t/u-boot.lds                         |    2 +-
 board/genietv/u-boot.lds                         |    2 +-
 board/hermes/u-boot.lds                          |    2 +-
 board/hymod/u-boot.lds                           |    2 +-
 board/icu862/u-boot.lds                          |    2 +-
 board/idmr/u-boot.lds                            |    2 +-
 board/ip860/u-boot.lds                           |    2 +-
 board/ivm/u-boot.lds                             |    2 +-
 board/korat/u-boot-F7FC.lds                      |    2 +-
 board/kup/kup4k/u-boot.lds                       |    2 +-
 board/kup/kup4x/u-boot.lds                       |    2 +-
 board/lwmon/u-boot.lds                           |    2 +-
 board/manroland/uc100/u-boot.lds                 |    2 +-
 board/matrix_vision/mvsmr/u-boot.lds             |    2 +-
 board/mbx8xx/u-boot.lds                          |    2 +-
 board/mousse/u-boot.lds                          |    2 +-
 board/mvblue/u-boot.lds                          |    2 +-
 board/netphone/u-boot.lds                        |    2 +-
 board/netta/u-boot.lds                           |    2 +-
 board/netta2/u-boot.lds                          |    2 +-
 board/netvia/u-boot.lds                          |    2 +-
 board/nx823/u-boot.lds                           |    2 +-
 board/openrisc/openrisc-generic/u-boot.lds       |    2 +-
 board/quantum/u-boot.lds                         |    2 +-
 board/r360mpi/u-boot.lds                         |    2 +-
 board/rbc823/u-boot.lds                          |    2 +-
 board/renesas/sh7757lcr/u-boot.lds               |    2 +-
 board/rsdproto/u-boot.lds                        |    2 +-
 board/samsung/smdk5250/smdk5250-uboot-spl.lds    |    2 +-
 board/samsung/smdk6400/u-boot-nand.lds           |    2 +-
 board/sandpoint/u-boot.lds                       |    2 +-
 board/sixnet/u-boot.lds                          |    2 +-
 board/snmc/qs850/u-boot.lds                      |    2 +-
 board/snmc/qs860t/u-boot.lds                     |    2 +-
 board/spc1920/u-boot.lds                         |    2 +-
 board/spd8xx/u-boot.lds                          |    2 +-
 board/stx/stxxtc/u-boot.lds                      |    2 +-
 board/svm_sc8xx/u-boot.lds                       |    2 +-
 board/tqc/tqm8xx/u-boot.lds                      |    2 +-
 board/v37/u-boot.lds                             |    2 +-
 board/vpac270/u-boot-spl.lds                     |    2 +-
 common/cmd_help.c                                |    2 +-
 common/command.c                                 |    1 +
 config.mk                                        |    2 -
 helper.mk                                        |   64 ------
 include/command.h                                |    2 +-
 include/env_callback.h                           |    2 +-
 include/linker_lists.h                           |  244 +++++++++++++++++-----
 nand_spl/board/freescale/mpc8536ds/Makefile      |    6 +-
 nand_spl/board/freescale/mpc8569mds/Makefile     |    6 +-
 nand_spl/board/freescale/mpc8572ds/Makefile      |    6 +-
 nand_spl/board/freescale/mx31pdk/Makefile        |    6 +-
 nand_spl/board/freescale/mx31pdk/u-boot.lds      |    2 +-
 nand_spl/board/freescale/p1010rdb/Makefile       |    6 +-
 nand_spl/board/freescale/p1023rds/Makefile       |    6 +-
 nand_spl/board/freescale/p1_p2_rdb/Makefile      |    6 +-
 nand_spl/board/karo/tx25/Makefile                |    6 +-
 nand_spl/board/karo/tx25/u-boot.lds              |    2 +-
 nand_spl/board/samsung/smdk6400/u-boot.lds       |    2 +-
 spl/Makefile                                     |    6 +-
 152 files changed, 342 insertions(+), 305 deletions(-)
 delete mode 100644 helper.mk

Comments

Heiko Schocher Feb. 2, 2013, 6:30 p.m. UTC | #1
Hello Albert,

On 02.02.2013 18:02, Albert ARIBAUD wrote:
> Refactor linker-generated array code so that symbols
> which were previously linker-generated are now compiler-
> generated. This causes relocation records of type
> R_ARM_ABS32 to become R_ARM_RELATIVE, which makes
> code which uses LGA able to run before relocation as
> well as after.

Just tested this patch and it solves my "ll_entry_* work
only after relocation" problem posted here:

http://lists.denx.de/pipermail/u-boot/2013-February/145711.html

Will test it deeper on monday, thanks!

bye,
Heiko
Jeroen Hofstee Feb. 2, 2013, 6:42 p.m. UTC | #2
Hello Albert,

On 02/02/2013 06:02 PM, Albert ARIBAUD wrote:
> Refactor linker-generated array code so that symbols
> which were previously linker-generated are now compiler-
> generated. This causes relocation records of type
> R_ARM_ABS32 to become R_ARM_RELATIVE, which makes
> code which uses LGA able to run before relocation as
> well as after.
>
> Note: this affects more than ARM targets, as linker-
> lists span possibly all target architectures, notably
> PowerPC.
>
> Signed-off-by: Albert ARIBAUD <albert.u.boot@aribaud.net>
> ---
Command completion currently traps with U-Boot master on a
twister board, as mentioned in [1]. Depending on random,
valid changes in the code, the name pointers in the command
list can become corrupted. Although this patch shouldn't effect
code running after relocation, it does prevent the incorrect
pointers and solves mentioned problem. The exact reason is
unknown, but it might be that code running before relocation
corrupts the data used after relocation.

At least this patch fixes the behaviour for the twister and prevents
that I get completely insane, thanks!

For the twister:
Tested-by: Jeroen Hofstee <jhofstee@myspectrum.nl>

Thanks,
Jeroen

[1] http://lists.denx.de/pipermail/u-boot/2013-February/145709.html
Heiko Schocher Feb. 4, 2013, 8:21 a.m. UTC | #3
Hello Albert,

On 02.02.2013 18:02, Albert ARIBAUD wrote:
> Refactor linker-generated array code so that symbols
> which were previously linker-generated are now compiler-
> generated. This causes relocation records of type
> R_ARM_ABS32 to become R_ARM_RELATIVE, which makes
> code which uses LGA able to run before relocation as
> well as after.
> 
> Note: this affects more than ARM targets, as linker-
> lists span possibly all target architectures, notably
> PowerPC.
> 
> Signed-off-by: Albert ARIBAUD <albert.u.boot@aribaud.net>
> ---

for arm926ejs

Tested-by: Heiko Schocher <hs@denx.de>

Just one minor comment ...

[...]
> diff --git a/common/command.c b/common/command.c
> index 50c8429..6ac59e4 100644
> --- a/common/command.c
> +++ b/common/command.c
> @@ -507,6 +507,7 @@ static int cmd_call(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
>  	int result;
>  
>  	result = (cmdtp->cmd)(cmdtp, flag, argc, argv);
> +

remove this Codingstyle change please.

bye,
Heiko
Albert ARIBAUD Feb. 4, 2013, 8:51 a.m. UTC | #4
Hi Heiko,

On Mon, 04 Feb 2013 09:21:02 +0100, Heiko Schocher <hs@denx.de> wrote:

> Hello Albert,
> 
> On 02.02.2013 18:02, Albert ARIBAUD wrote:
> > Refactor linker-generated array code so that symbols
> > which were previously linker-generated are now compiler-
> > generated. This causes relocation records of type
> > R_ARM_ABS32 to become R_ARM_RELATIVE, which makes
> > code which uses LGA able to run before relocation as
> > well as after.
> > 
> > Note: this affects more than ARM targets, as linker-
> > lists span possibly all target architectures, notably
> > PowerPC.
> > 
> > Signed-off-by: Albert ARIBAUD <albert.u.boot@aribaud.net>
> > ---
> 
> for arm926ejs
> 
> Tested-by: Heiko Schocher <hs@denx.de>

Thanks!

> Just one minor comment ...
> 
> [...]
> > diff --git a/common/command.c b/common/command.c
> > index 50c8429..6ac59e4 100644
> > --- a/common/command.c
> > +++ b/common/command.c
> > @@ -507,6 +507,7 @@ static int cmd_call(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
> >  	int result;
> >  
> >  	result = (cmdtp->cmd)(cmdtp, flag, argc, argv);
> > +
> 
> remove this Codingstyle change please.

Sorry, should have triple-checked that -- this single blank line change
in common/command.c stems from ad hoc code I'd added here for test
purposes when the patch was only proof-of-concept. Will fix in V2.

> bye,
> Heiko

Amicalement,
Andreas Bießmann Feb. 4, 2013, 12:41 p.m. UTC | #5
Hi Albert,

On 02.02.2013 18:02, Albert ARIBAUD wrote:
> Refactor linker-generated array code so that symbols
> which were previously linker-generated are now compiler-
> generated. This causes relocation records of type
> R_ARM_ABS32 to become R_ARM_RELATIVE, which makes
> code which uses LGA able to run before relocation as
> well as after.
> 
> Note: this affects more than ARM targets, as linker-
> lists span possibly all target architectures, notably
> PowerPC.
> 
> Signed-off-by: Albert ARIBAUD <albert.u.boot@aribaud.net>

Tested on avr32. The patch seems to work (basic shell testing), however
it generates an aliasing warning:

---8<---
abiessmann@azuregos % PATH=$AVR32_PATH:$PATH BUILD_DIR=/tmp/build_avr32
MAKEALL_LOGDIR=/tmp/LOG BUILD_NCPUS=4 BUILD_NBUILDS=4 ./MAKEALL atstk1002
Configuring for atstk1002 board...
   text	   data	    bss	    dec	    hex	filename
 116315	   8972	 211900	 337187	  52523	/tmp/build_avr32/atstk1002/u-boot
env_callback.c: In function 'find_env_callback':
env_callback.c:47: warning: dereferencing pointer 'clbkp' does break
strict-aliasing rules
env_callback.c:44: note: initialized from here
env_callback.c:46: note: initialized from here
--->8---

I think it has something to do with tha fact that you re-cast the
anonymous struct 'start' here:

---8<---
#define ll_entry_start(_type, _list)
({
	static struct {} start __aligned(4) __attribute__((unused,
		section(".u_boot_list_2_"#_list"_1")));
	(_type *)&start;
})
--->8---

I think other gcc-4.4 users will see the same error. Currently I have no
time to dive into this.

Best regards

Andreas Bießmann
Albert ARIBAUD Feb. 4, 2013, 2:22 p.m. UTC | #6
Hi Andreas,

On Mon, 04 Feb 2013 13:41:09 +0100, "Andreas Bießmann"
<andreas.devel@googlemail.com> wrote:

> Hi Albert,
> 
> On 02.02.2013 18:02, Albert ARIBAUD wrote:
> > Refactor linker-generated array code so that symbols
> > which were previously linker-generated are now compiler-
> > generated. This causes relocation records of type
> > R_ARM_ABS32 to become R_ARM_RELATIVE, which makes
> > code which uses LGA able to run before relocation as
> > well as after.
> > 
> > Note: this affects more than ARM targets, as linker-
> > lists span possibly all target architectures, notably
> > PowerPC.
> > 
> > Signed-off-by: Albert ARIBAUD <albert.u.boot@aribaud.net>
> 
> Tested on avr32. The patch seems to work (basic shell testing), however
> it generates an aliasing warning:
> 
> ---8<---
> abiessmann@azuregos % PATH=$AVR32_PATH:$PATH BUILD_DIR=/tmp/build_avr32
> MAKEALL_LOGDIR=/tmp/LOG BUILD_NCPUS=4 BUILD_NBUILDS=4 ./MAKEALL atstk1002
> Configuring for atstk1002 board...
>    text	   data	    bss	    dec	    hex	filename
>  116315	   8972	 211900	 337187	  52523	/tmp/build_avr32/atstk1002/u-boot
> env_callback.c: In function 'find_env_callback':
> env_callback.c:47: warning: dereferencing pointer 'clbkp' does break
> strict-aliasing rules
> env_callback.c:44: note: initialized from here
> env_callback.c:46: note: initialized from here
> --->8---
> 
> I think it has something to do with tha fact that you re-cast the
> anonymous struct 'start' here:
> 
> ---8<---
> #define ll_entry_start(_type, _list)
> ({
> 	static struct {} start __aligned(4) __attribute__((unused,
> 		section(".u_boot_list_2_"#_list"_1")));
> 	(_type *)&start;
> })
> --->8---

Thanks Andreas for bringing this to my attention -- I'm surprised that
there's only one such warning, though, as there are may such casts. I'll
get my hands on a 4.4 compiler and try to find a way to cleanly avoid
the warning.

> I think other gcc-4.4 users will see the same error. Currently I have no
> time to dive into this.

Don't bother. I'll do the diving. :)

> Best regards
> 
> Andreas Bießmann

Amicalement,
Albert ARIBAUD Feb. 16, 2013, 6:20 p.m. UTC | #7
Hi Andreas,

On Mon, 04 Feb 2013 13:41:09 +0100, "Andreas Bießmann"
<andreas.devel@googlemail.com> wrote:

> Hi Albert,
> 
> On 02.02.2013 18:02, Albert ARIBAUD wrote:
> > Refactor linker-generated array code so that symbols
> > which were previously linker-generated are now compiler-
> > generated. This causes relocation records of type
> > R_ARM_ABS32 to become R_ARM_RELATIVE, which makes
> > code which uses LGA able to run before relocation as
> > well as after.
> > 
> > Note: this affects more than ARM targets, as linker-
> > lists span possibly all target architectures, notably
> > PowerPC.
> > 
> > Signed-off-by: Albert ARIBAUD <albert.u.boot@aribaud.net>
> 
> Tested on avr32. The patch seems to work (basic shell testing), however
> it generates an aliasing warning:
> 
> ---8<---
> abiessmann@azuregos % PATH=$AVR32_PATH:$PATH BUILD_DIR=/tmp/build_avr32
> MAKEALL_LOGDIR=/tmp/LOG BUILD_NCPUS=4 BUILD_NBUILDS=4 ./MAKEALL atstk1002
> Configuring for atstk1002 board...
>    text	   data	    bss	    dec	    hex	filename
>  116315	   8972	 211900	 337187	  52523	/tmp/build_avr32/atstk1002/u-boot
> env_callback.c: In function 'find_env_callback':
> env_callback.c:47: warning: dereferencing pointer 'clbkp' does break
> strict-aliasing rules
> env_callback.c:44: note: initialized from here
> env_callback.c:46: note: initialized from here
> --->8---
> 
> I think it has something to do with tha fact that you re-cast the
> anonymous struct 'start' here:
> 
> ---8<---
> #define ll_entry_start(_type, _list)
> ({
> 	static struct {} start __aligned(4) __attribute__((unused,
> 		section(".u_boot_list_2_"#_list"_1")));
> 	(_type *)&start;
> })
> --->8---
> 
> I think other gcc-4.4 users will see the same error. Currently I have no
> time to dive into this.

I have dug into it and found a way to avoid GCC 4.4 or below to warn
about aliasing, by replacing 'struct {}' with 'char[0]' as the
0-byte-size type.

I still have some warnings through, regarding some regions not being
declared:

avr32-ld:built in linker script:15: warning: memory region `FLASH' not
declared
avr32-ld:built in linker script:69: warning: memory region
`CPUSRAM' not declared

It appears 'normal' in that without my patch, the same error occurs;
but I'd prefer that you confirm whether you have the same warnings on
your side.

> Best regards
> 
> Andreas Bießmann

Amicalement,
Andreas Bießmann Feb. 18, 2013, 10:39 a.m. UTC | #8
Hi Albert,

On 02/16/2013 07:20 PM, Albert ARIBAUD wrote:
> Hi Andreas,
> 
> On Mon, 04 Feb 2013 13:41:09 +0100, "Andreas Bießmann"
> <andreas.devel@googlemail.com> wrote:
> 
>> Hi Albert,
>>
>> On 02.02.2013 18:02, Albert ARIBAUD wrote:

<snip strict aliasing error on gcc-4.4>

> I have dug into it and found a way to avoid GCC 4.4 or below to warn
> about aliasing, by replacing 'struct {}' with 'char[0]' as the
> 0-byte-size type.
> 
> I still have some warnings through, regarding some regions not being
> declared:
> 
> avr32-ld:built in linker script:15: warning: memory region `FLASH' not
> declared
> avr32-ld:built in linker script:69: warning: memory region
> `CPUSRAM' not declared

I assume you use Mike Frysingers precompiled avr32 toolchain. I know
about that warnings and beware, these toolchain produce defective
binaries! The u-boot does not relocate itself properly with these newlib
toolchains (also the atmel provided one).

> It appears 'normal' in that without my patch, the same error occurs;
> but I'd prefer that you confirm whether you have the same warnings on
> your side.

It's ok so far, the arm-linux toolchain I have do not produce these
warnings. Kan you provide the patch so I will do a runtime test.

Best regards

Andreas Bießmann
Andreas Bießmann Feb. 18, 2013, 10:42 a.m. UTC | #9
On 02/18/2013 11:39 AM, Andreas Bießmann wrote:
> Hi Albert,
> 
> On 02/16/2013 07:20 PM, Albert ARIBAUD wrote:

<snip>

> It's ok so far, the arm-linux toolchain I have do not produce these

I mean avr32-linux ... damn weekend ...
Albert ARIBAUD Feb. 18, 2013, 4:48 p.m. UTC | #10
Hi Andreas,

On Mon, 18 Feb 2013 11:42:07 +0100, "Andreas Bießmann"
<andreas.devel@googlemail.com> wrote:

> On 02/18/2013 11:39 AM, Andreas Bießmann wrote:
> > Hi Albert,
> > 
> > On 02/16/2013 07:20 PM, Albert ARIBAUD wrote:
> 
> <snip>
> 
> > It's ok so far, the arm-linux toolchain I have do not produce these
> 
> I mean avr32-linux ... damn weekend ...

Thanks Andreas for the feedback. I am currently testing V2 locally
and will send it out in a few hours hopefully.

Amicalement,
Albert ARIBAUD Feb. 25, 2013, 10:58 a.m. UTC | #11
R_ARM_ABS32 relocation records cause symbol references
to be zero before relocation, and become correct only
after relocation. On the other hand, R_ARM_RELATIVE
records make references correct before as well as
after relocation.

This patch series aims at removing all R_ARM_ABS32
relocations from ARM targets.

the main contributor of R_ARM_ABS32 relocations is the
support code for linker-lists, aka Linker-Generated
Arrays. This is due to the fact that LGA start and end
symbols, used for ranging these arrays, are linker-
generated symbols, which always relocate as R_ARM_ABS32
even though they are supposed *not* to be absolute.

V1 of this patch series fixed LGAs so that start or
end symbols are actually compiler-generated, and thus
their references are relocated using R_ARM_RELATIVE;
V2 also fixes crt0 so that BSS start and end references
do not produce R_ARM_ABS32 relocations either.

With V2, none of the targets built with MAKEALL -a arm
produces any R_ARM_ABS32 relocation.

This series has been build-tested with ARM (295 targets
clean) and powerpc (634 targets clean)

Changes in v2:
- fixed missing .sram memory mapping in OMAP lds
- removed useless linker script sections in SPL lds files
- made BSS start and end compiler-generated
- moved SPL linker script changes to their own commit
- added KEEP() to all linker files
- removed spurious change to common/command.c
- changed empty type from struct {} to char[0]
- dropped patch to removed board/micronas/vct/u-boot.lds
- removed all references to u-boot.lst

Albert ARIBAUD (4):
  arm: omap: map u_boot_lists section to .sram
  Remove linker lists (LGAs) from SPL linker scripts
  arm: make __bss_start and __bss_end__ compiler-generated
  Refactor linker-generated arrays

 .gitignore                                       |    1 -
 Makefile                                         |   13 +-
 arch/arm/cpu/arm920t/ep93xx/u-boot.lds           |    2 +-
 arch/arm/cpu/arm926ejs/mxs/u-boot-spl.lds        |    6 -
 arch/arm/cpu/arm926ejs/spear/u-boot-spl.lds      |    6 -
 arch/arm/cpu/armv7/am33xx/u-boot-spl.lds         |   67 ++++++
 arch/arm/cpu/armv7/omap-common/u-boot-spl.lds    |    4 -
 arch/arm/cpu/ixp/u-boot.lds                      |   14 +-
 arch/arm/cpu/u-boot-spl.lds                      |   93 ++++++++
 arch/arm/cpu/u-boot.lds                          |   14 +-
 arch/arm/lib/Makefile                            |    1 +
 arch/arm/lib/bss.c                               |   39 ++++
 arch/avr32/cpu/u-boot.lds                        |    2 +-
 arch/blackfin/cpu/u-boot.lds                     |    2 +-
 arch/microblaze/cpu/u-boot.lds                   |    2 +-
 arch/mips/cpu/u-boot.lds                         |    2 +-
 arch/nds32/cpu/n1213/u-boot.lds                  |    2 +-
 arch/nios2/cpu/u-boot.lds                        |    2 +-
 arch/powerpc/cpu/74xx_7xx/u-boot.lds             |    2 +-
 arch/powerpc/cpu/mpc512x/u-boot.lds              |    2 +-
 arch/powerpc/cpu/mpc5xx/u-boot.lds               |    2 +-
 arch/powerpc/cpu/mpc5xxx/u-boot-customlayout.lds |    2 +-
 arch/powerpc/cpu/mpc5xxx/u-boot.lds              |    2 +-
 arch/powerpc/cpu/mpc8220/u-boot.lds              |    2 +-
 arch/powerpc/cpu/mpc824x/u-boot.lds              |    2 +-
 arch/powerpc/cpu/mpc8260/u-boot.lds              |    2 +-
 arch/powerpc/cpu/mpc83xx/u-boot.lds              |    2 +-
 arch/powerpc/cpu/mpc85xx/u-boot-nand.lds         |    2 +-
 arch/powerpc/cpu/mpc85xx/u-boot-nand_spl.lds     |    2 +-
 arch/powerpc/cpu/mpc85xx/u-boot.lds              |    2 +-
 arch/powerpc/cpu/mpc86xx/u-boot.lds              |    2 +-
 arch/powerpc/cpu/ppc4xx/u-boot.lds               |    2 +-
 arch/sandbox/cpu/u-boot.lds                      |    2 +-
 arch/sh/cpu/sh2/u-boot.lds                       |    2 +-
 arch/sh/cpu/sh3/u-boot.lds                       |    2 +-
 arch/sh/cpu/sh4/u-boot.lds                       |    2 +-
 arch/x86/cpu/u-boot.lds                          |    2 +-
 board/BuS/eb_cpu5282/u-boot.lds                  |    2 +-
 board/LEOX/elpt860/u-boot.lds                    |    2 +-
 board/RPXClassic/u-boot.lds                      |    2 +-
 board/RPXClassic/u-boot.lds.debug                |    2 +-
 board/RPXlite/u-boot.lds                         |    2 +-
 board/RPXlite/u-boot.lds.debug                   |    2 +-
 board/RPXlite_dw/u-boot.lds                      |    2 +-
 board/RPXlite_dw/u-boot.lds.debug                |    2 +-
 board/RRvision/u-boot.lds                        |    2 +-
 board/actux1/u-boot.lds                          |   24 ++-
 board/actux2/u-boot.lds                          |   24 ++-
 board/actux3/u-boot.lds                          |   18 +-
 board/adder/u-boot.lds                           |    2 +-
 board/ait/cam_enc_4xx/u-boot-spl.lds             |    4 -
 board/altera/nios2-generic/u-boot.lds            |    2 +-
 board/amcc/acadia/u-boot-nand.lds                |    2 +-
 board/amcc/bamboo/u-boot-nand.lds                |    2 +-
 board/amcc/canyonlands/u-boot-nand.lds           |    2 +-
 board/amcc/kilauea/u-boot-nand.lds               |    2 +-
 board/amcc/sequoia/u-boot-nand.lds               |    2 +-
 board/amcc/sequoia/u-boot-ram.lds                |    2 +-
 board/astro/mcf5373l/u-boot.lds                  |    2 +-
 board/cobra5272/u-boot.lds                       |    2 +-
 board/cogent/u-boot.lds                          |    2 +-
 board/cogent/u-boot.lds.debug                    |    2 +-
 board/cray/L1/u-boot.lds.debug                   |    2 +-
 board/dave/PPChameleonEVB/u-boot.lds             |    2 +-
 board/davinci/da8xxevm/u-boot-spl-da850evm.lds   |    5 -
 board/davinci/da8xxevm/u-boot-spl-hawk.lds       |    5 -
 board/dvlhost/u-boot.lds                         |   18 +-
 board/eltec/mhpc/u-boot.lds                      |    2 +-
 board/eltec/mhpc/u-boot.lds.debug                |    2 +-
 board/emk/top860/u-boot.lds                      |    2 +-
 board/ep88x/u-boot.lds                           |    2 +-
 board/esd/dasa_sim/u-boot.lds                    |    2 +-
 board/esd/pmc440/u-boot-nand.lds                 |    2 +-
 board/esd/tasreg/u-boot.lds                      |    2 +-
 board/esteem192e/u-boot.lds                      |    2 +-
 board/evb64260/u-boot.lds                        |    2 +-
 board/fads/u-boot.lds                            |    2 +-
 board/flagadm/u-boot.lds                         |    2 +-
 board/flagadm/u-boot.lds.debug                   |    2 +-
 board/freescale/m5208evbe/u-boot.lds             |    2 +-
 board/freescale/m52277evb/u-boot.lds             |    2 +-
 board/freescale/m5235evb/u-boot.lds              |    2 +-
 board/freescale/m5249evb/u-boot.lds              |    2 +-
 board/freescale/m5253demo/u-boot.lds             |    2 +-
 board/freescale/m5253evbe/u-boot.lds             |    2 +-
 board/freescale/m5271evb/u-boot.lds              |    2 +-
 board/freescale/m5272c3/u-boot.lds               |    2 +-
 board/freescale/m5275evb/u-boot.lds              |    2 +-
 board/freescale/m5282evb/u-boot.lds              |    2 +-
 board/freescale/m53017evb/u-boot.lds             |    2 +-
 board/freescale/m5329evb/u-boot.lds              |    2 +-
 board/freescale/m5373evb/u-boot.lds              |    2 +-
 board/freescale/m54418twr/u-boot.lds             |    2 +-
 board/freescale/m54451evb/u-boot.lds             |    2 +-
 board/freescale/m54455evb/u-boot.lds             |    2 +-
 board/freescale/m547xevb/u-boot.lds              |    2 +-
 board/freescale/m548xevb/u-boot.lds              |    2 +-
 board/freescale/mx31ads/u-boot.lds               |   16 +-
 board/gaisler/gr_cpci_ax2000/u-boot.lds          |    2 +-
 board/gaisler/gr_ep2s60/u-boot.lds               |    2 +-
 board/gaisler/gr_xc3s_1500/u-boot.lds            |    2 +-
 board/gaisler/grsim/u-boot.lds                   |    2 +-
 board/gaisler/grsim_leon2/u-boot.lds             |    2 +-
 board/gen860t/u-boot-flashenv.lds                |    2 +-
 board/gen860t/u-boot.lds                         |    2 +-
 board/genietv/u-boot.lds                         |    2 +-
 board/genietv/u-boot.lds.debug                   |    2 +-
 board/hermes/u-boot.lds                          |    2 +-
 board/hermes/u-boot.lds.debug                    |    2 +-
 board/hymod/u-boot.lds                           |    2 +-
 board/hymod/u-boot.lds.debug                     |    2 +-
 board/icu862/u-boot.lds                          |    2 +-
 board/icu862/u-boot.lds.debug                    |    2 +-
 board/idmr/u-boot.lds                            |    2 +-
 board/ip860/u-boot.lds                           |    2 +-
 board/ip860/u-boot.lds.debug                     |    2 +-
 board/ivm/u-boot.lds                             |    2 +-
 board/ivm/u-boot.lds.debug                       |    2 +-
 board/korat/u-boot-F7FC.lds                      |    2 +-
 board/kup/kup4k/u-boot.lds                       |    2 +-
 board/kup/kup4k/u-boot.lds.debug                 |    2 +-
 board/kup/kup4x/u-boot.lds                       |    2 +-
 board/kup/kup4x/u-boot.lds.debug                 |    2 +-
 board/lwmon/u-boot.lds                           |    2 +-
 board/lwmon/u-boot.lds.debug                     |    2 +-
 board/manroland/uc100/u-boot.lds                 |    2 +-
 board/matrix_vision/mvsmr/u-boot.lds             |    2 +-
 board/mbx8xx/u-boot.lds                          |    2 +-
 board/mbx8xx/u-boot.lds.debug                    |    2 +-
 board/mousse/u-boot.lds                          |    2 +-
 board/mpl/pip405/u-boot.lds.debug                |    2 +-
 board/mvblue/u-boot.lds                          |    2 +-
 board/netphone/u-boot.lds                        |    2 +-
 board/netphone/u-boot.lds.debug                  |    2 +-
 board/netta/u-boot.lds                           |    2 +-
 board/netta/u-boot.lds.debug                     |    2 +-
 board/netta2/u-boot.lds                          |    2 +-
 board/netta2/u-boot.lds.debug                    |    2 +-
 board/netvia/u-boot.lds                          |    2 +-
 board/netvia/u-boot.lds.debug                    |    2 +-
 board/nx823/u-boot.lds                           |    2 +-
 board/nx823/u-boot.lds.debug                     |    2 +-
 board/openrisc/openrisc-generic/u-boot.lds       |    2 +-
 board/quantum/u-boot.lds                         |    2 +-
 board/r360mpi/u-boot.lds                         |    2 +-
 board/rbc823/u-boot.lds                          |    2 +-
 board/renesas/sh7752evb/u-boot.lds               |    2 +-
 board/renesas/sh7757lcr/u-boot.lds               |    2 +-
 board/rsdproto/u-boot.lds                        |    2 +-
 board/samsung/smdk5250/smdk5250-uboot-spl.lds    |    2 +-
 board/samsung/smdk6400/u-boot-nand.lds           |    2 +-
 board/sandburst/karef/u-boot.lds.debug           |    2 +-
 board/sandburst/metrobox/u-boot.lds.debug        |    2 +-
 board/sandpoint/u-boot.lds                       |    2 +-
 board/sixnet/u-boot.lds                          |    2 +-
 board/snmc/qs850/u-boot.lds                      |    2 +-
 board/snmc/qs860t/u-boot.lds                     |    2 +-
 board/spc1920/u-boot.lds                         |    2 +-
 board/spd8xx/u-boot.lds                          |    2 +-
 board/spd8xx/u-boot.lds.debug                    |    2 +-
 board/stx/stxxtc/u-boot.lds                      |    2 +-
 board/stx/stxxtc/u-boot.lds.debug                |    2 +-
 board/svm_sc8xx/u-boot.lds                       |    2 +-
 board/tqc/tqm8xx/u-boot.lds                      |    2 +-
 board/v37/u-boot.lds                             |    2 +-
 board/vpac270/u-boot-spl.lds                     |    4 -
 board/w7o/u-boot.lds.debug                       |    2 +-
 board/xes/xpedite1000/u-boot.lds.debug           |    2 +-
 common/cmd_help.c                                |    2 +-
 config.mk                                        |    2 -
 doc/README.commands                              |   18 +-
 helper.mk                                        |   64 ------
 include/command.h                                |    2 +-
 include/configs/am335x_evm.h                     |    2 +-
 include/configs/pcm051.h                         |    2 +-
 include/env_callback.h                           |    2 +-
 include/linker_lists.h                           |  252 +++++++++++++++++-----
 nand_spl/board/freescale/mpc8536ds/Makefile      |    7 +-
 nand_spl/board/freescale/mpc8569mds/Makefile     |    7 +-
 nand_spl/board/freescale/mpc8572ds/Makefile      |    7 +-
 nand_spl/board/freescale/mx31pdk/Makefile        |    7 +-
 nand_spl/board/freescale/mx31pdk/u-boot.lds      |    2 +-
 nand_spl/board/freescale/p1010rdb/Makefile       |    7 +-
 nand_spl/board/freescale/p1023rds/Makefile       |    7 +-
 nand_spl/board/freescale/p1_p2_rdb/Makefile      |    7 +-
 nand_spl/board/karo/tx25/Makefile                |    7 +-
 nand_spl/board/karo/tx25/u-boot.lds              |    2 +-
 nand_spl/board/samsung/smdk6400/u-boot.lds       |    2 +-
 spl/.gitignore                                   |    1 -
 spl/Makefile                                     |    8 +-
 190 files changed, 665 insertions(+), 424 deletions(-)
 create mode 100644 arch/arm/cpu/armv7/am33xx/u-boot-spl.lds
 create mode 100644 arch/arm/cpu/u-boot-spl.lds
 create mode 100644 arch/arm/lib/bss.c
 delete mode 100644 helper.mk
Marek Vasut Feb. 25, 2013, 11:32 a.m. UTC | #12
Dear Albert ARIBAUD,

> R_ARM_ABS32 relocation records cause symbol references
> to be zero before relocation, and become correct only
> after relocation. On the other hand, R_ARM_RELATIVE
> records make references correct before as well as
> after relocation.
> 
> This patch series aims at removing all R_ARM_ABS32
> relocations from ARM targets.
> 
> the main contributor of R_ARM_ABS32 relocations is the
> support code for linker-lists, aka Linker-Generated
> Arrays. This is due to the fact that LGA start and end
> symbols, used for ranging these arrays, are linker-
> generated symbols, which always relocate as R_ARM_ABS32
> even though they are supposed *not* to be absolute.
> 
> V1 of this patch series fixed LGAs so that start or
> end symbols are actually compiler-generated, and thus
> their references are relocated using R_ARM_RELATIVE;
> V2 also fixes crt0 so that BSS start and end references
> do not produce R_ARM_ABS32 relocations either.
> 
> With V2, none of the targets built with MAKEALL -a arm
> produces any R_ARM_ABS32 relocation.
> 
> This series has been build-tested with ARM (295 targets
> clean) and powerpc (634 targets clean)
> 
> Changes in v2:
> - fixed missing .sram memory mapping in OMAP lds
> - removed useless linker script sections in SPL lds files
> - made BSS start and end compiler-generated
> - moved SPL linker script changes to their own commit
> - added KEEP() to all linker files
> - removed spurious change to common/command.c
> - changed empty type from struct {} to char[0]
> - dropped patch to removed board/micronas/vct/u-boot.lds
> - removed all references to u-boot.lst
> 
> Albert ARIBAUD (4):
>   arm: omap: map u_boot_lists section to .sram
>   Remove linker lists (LGAs) from SPL linker scripts
>   arm: make __bss_start and __bss_end__ compiler-generated
>   Refactor linker-generated arrays

[...]

Reviewed-by: Marek Vasut <marex@denx.de>
Tom Rini Feb. 25, 2013, 3:19 p.m. UTC | #13
On Mon, Feb 25, 2013 at 11:58:56AM +0100, Albert ARIBAUD wrote:

> R_ARM_ABS32 relocation records cause symbol references
> to be zero before relocation, and become correct only
> after relocation. On the other hand, R_ARM_RELATIVE
> records make references correct before as well as
> after relocation.
> 
> This patch series aims at removing all R_ARM_ABS32
> relocations from ARM targets.
> 
> the main contributor of R_ARM_ABS32 relocations is the
> support code for linker-lists, aka Linker-Generated
> Arrays. This is due to the fact that LGA start and end
> symbols, used for ranging these arrays, are linker-
> generated symbols, which always relocate as R_ARM_ABS32
> even though they are supposed *not* to be absolute.
> 
> V1 of this patch series fixed LGAs so that start or
> end symbols are actually compiler-generated, and thus
> their references are relocated using R_ARM_RELATIVE;
> V2 also fixes crt0 so that BSS start and end references
> do not produce R_ARM_ABS32 relocations either.
> 
> With V2, none of the targets built with MAKEALL -a arm
> produces any R_ARM_ABS32 relocation.
> 
> This series has been build-tested with ARM (295 targets
> clean) and powerpc (634 targets clean)
> 
> Changes in v2:
> - fixed missing .sram memory mapping in OMAP lds
> - removed useless linker script sections in SPL lds files
> - made BSS start and end compiler-generated
> - moved SPL linker script changes to their own commit
> - added KEEP() to all linker files
> - removed spurious change to common/command.c
> - changed empty type from struct {} to char[0]
> - dropped patch to removed board/micronas/vct/u-boot.lds
> - removed all references to u-boot.lst
> 
> Albert ARIBAUD (4):
>   arm: omap: map u_boot_lists section to .sram
>   Remove linker lists (LGAs) from SPL linker scripts
>   arm: make __bss_start and __bss_end__ compiler-generated
>   Refactor linker-generated arrays

Reviewed-by: Tom Rini <trini@ti.com>

Aside from ARM and I assume Sandbox, has this been runtime tested on
other arches yet?
Daniel Schwierzeck Feb. 25, 2013, 4:20 p.m. UTC | #14
Hi Albert, Tom,

2013/2/25 Tom Rini <trini@ti.com>:
> On Mon, Feb 25, 2013 at 11:58:56AM +0100, Albert ARIBAUD wrote:
>
>> R_ARM_ABS32 relocation records cause symbol references
>> to be zero before relocation, and become correct only
>> after relocation. On the other hand, R_ARM_RELATIVE
>> records make references correct before as well as
>> after relocation.
>>
>> This patch series aims at removing all R_ARM_ABS32
>> relocations from ARM targets.
>>
>> the main contributor of R_ARM_ABS32 relocations is the
>> support code for linker-lists, aka Linker-Generated
>> Arrays. This is due to the fact that LGA start and end
>> symbols, used for ranging these arrays, are linker-
>> generated symbols, which always relocate as R_ARM_ABS32
>> even though they are supposed *not* to be absolute.
>>
>> V1 of this patch series fixed LGAs so that start or
>> end symbols are actually compiler-generated, and thus
>> their references are relocated using R_ARM_RELATIVE;
>> V2 also fixes crt0 so that BSS start and end references
>> do not produce R_ARM_ABS32 relocations either.
>>
>> With V2, none of the targets built with MAKEALL -a arm
>> produces any R_ARM_ABS32 relocation.
>>
>> This series has been build-tested with ARM (295 targets
>> clean) and powerpc (634 targets clean)
>>
>> Changes in v2:
>> - fixed missing .sram memory mapping in OMAP lds
>> - removed useless linker script sections in SPL lds files
>> - made BSS start and end compiler-generated
>> - moved SPL linker script changes to their own commit
>> - added KEEP() to all linker files
>> - removed spurious change to common/command.c
>> - changed empty type from struct {} to char[0]
>> - dropped patch to removed board/micronas/vct/u-boot.lds
>> - removed all references to u-boot.lst
>>
>> Albert ARIBAUD (4):
>>   arm: omap: map u_boot_lists section to .sram
>>   Remove linker lists (LGAs) from SPL linker scripts
>>   arm: make __bss_start and __bss_end__ compiler-generated
>>   Refactor linker-generated arrays
>
> Reviewed-by: Tom Rini <trini@ti.com>
>
> Aside from ARM and I assume Sandbox, has this been runtime tested on
> other arches yet?
>

I've runtime tested the refactored LGA on MIPS, so

Tested-by: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
Albert ARIBAUD Feb. 25, 2013, 5:22 p.m. UTC | #15
Hi Tom,

On Mon, 25 Feb 2013 10:19:13 -0500, Tom Rini <trini@ti.com> wrote:

> On Mon, Feb 25, 2013 at 11:58:56AM +0100, Albert ARIBAUD wrote:
> 
> > R_ARM_ABS32 relocation records cause symbol references
> > to be zero before relocation, and become correct only
> > after relocation. On the other hand, R_ARM_RELATIVE
> > records make references correct before as well as
> > after relocation.
> > 
> > This patch series aims at removing all R_ARM_ABS32
> > relocations from ARM targets.
> > 
> > the main contributor of R_ARM_ABS32 relocations is the
> > support code for linker-lists, aka Linker-Generated
> > Arrays. This is due to the fact that LGA start and end
> > symbols, used for ranging these arrays, are linker-
> > generated symbols, which always relocate as R_ARM_ABS32
> > even though they are supposed *not* to be absolute.
> > 
> > V1 of this patch series fixed LGAs so that start or
> > end symbols are actually compiler-generated, and thus
> > their references are relocated using R_ARM_RELATIVE;
> > V2 also fixes crt0 so that BSS start and end references
> > do not produce R_ARM_ABS32 relocations either.
> > 
> > With V2, none of the targets built with MAKEALL -a arm
> > produces any R_ARM_ABS32 relocation.
> > 
> > This series has been build-tested with ARM (295 targets
> > clean) and powerpc (634 targets clean)
> > 
> > Changes in v2:
> > - fixed missing .sram memory mapping in OMAP lds
> > - removed useless linker script sections in SPL lds files
> > - made BSS start and end compiler-generated
> > - moved SPL linker script changes to their own commit
> > - added KEEP() to all linker files
> > - removed spurious change to common/command.c
> > - changed empty type from struct {} to char[0]
> > - dropped patch to removed board/micronas/vct/u-boot.lds
> > - removed all references to u-boot.lst
> > 
> > Albert ARIBAUD (4):
> >   arm: omap: map u_boot_lists section to .sram
> >   Remove linker lists (LGAs) from SPL linker scripts
> >   arm: make __bss_start and __bss_end__ compiler-generated
> >   Refactor linker-generated arrays
> 
> Reviewed-by: Tom Rini <trini@ti.com>
> 
> Aside from ARM and I assume Sandbox, has this been runtime tested on
> other arches yet?

None other on my side.

Amicalement,
Tom Rini March 13, 2013, 6:39 p.m. UTC | #16
On Mon, Feb 25, 2013 at 05:20:34PM +0100, Daniel Schwierzeck wrote:

> Hi Albert, Tom,
> 
> 2013/2/25 Tom Rini <trini@ti.com>:
> > On Mon, Feb 25, 2013 at 11:58:56AM +0100, Albert ARIBAUD wrote:
> >
> >> R_ARM_ABS32 relocation records cause symbol references
> >> to be zero before relocation, and become correct only
> >> after relocation. On the other hand, R_ARM_RELATIVE
> >> records make references correct before as well as
> >> after relocation.
> >>
> >> This patch series aims at removing all R_ARM_ABS32
> >> relocations from ARM targets.
> >>
> >> the main contributor of R_ARM_ABS32 relocations is the
> >> support code for linker-lists, aka Linker-Generated
> >> Arrays. This is due to the fact that LGA start and end
> >> symbols, used for ranging these arrays, are linker-
> >> generated symbols, which always relocate as R_ARM_ABS32
> >> even though they are supposed *not* to be absolute.
> >>
> >> V1 of this patch series fixed LGAs so that start or
> >> end symbols are actually compiler-generated, and thus
> >> their references are relocated using R_ARM_RELATIVE;
> >> V2 also fixes crt0 so that BSS start and end references
> >> do not produce R_ARM_ABS32 relocations either.
> >>
> >> With V2, none of the targets built with MAKEALL -a arm
> >> produces any R_ARM_ABS32 relocation.
> >>
> >> This series has been build-tested with ARM (295 targets
> >> clean) and powerpc (634 targets clean)
> >>
> >> Changes in v2:
> >> - fixed missing .sram memory mapping in OMAP lds
> >> - removed useless linker script sections in SPL lds files
> >> - made BSS start and end compiler-generated
> >> - moved SPL linker script changes to their own commit
> >> - added KEEP() to all linker files
> >> - removed spurious change to common/command.c
> >> - changed empty type from struct {} to char[0]
> >> - dropped patch to removed board/micronas/vct/u-boot.lds
> >> - removed all references to u-boot.lst
> >>
> >> Albert ARIBAUD (4):
> >>   arm: omap: map u_boot_lists section to .sram
> >>   Remove linker lists (LGAs) from SPL linker scripts
> >>   arm: make __bss_start and __bss_end__ compiler-generated
> >>   Refactor linker-generated arrays
> >
> > Reviewed-by: Tom Rini <trini@ti.com>
> >
> > Aside from ARM and I assume Sandbox, has this been runtime tested on
> > other arches yet?
> >
> 
> I've runtime tested the refactored LGA on MIPS, so
> 
> Tested-by: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>

I've also now tested this on am335x_evm as part of seeing if it resolved
another issue:

Tested-by: Tom Rini <trini@ti.com>

Lets bring this in please, thanks!
Albert ARIBAUD March 13, 2013, 9:15 p.m. UTC | #17
On Mon, 25 Feb 2013 11:58:56 +0100, Albert ARIBAUD
<albert.u.boot@aribaud.net> wrote:

> R_ARM_ABS32 relocation records cause symbol references
> to be zero before relocation, and become correct only
> after relocation. On the other hand, R_ARM_RELATIVE
> records make references correct before as well as
> after relocation.
> 
> This patch series aims at removing all R_ARM_ABS32
> relocations from ARM targets.
> 
> the main contributor of R_ARM_ABS32 relocations is the
> support code for linker-lists, aka Linker-Generated
> Arrays. This is due to the fact that LGA start and end
> symbols, used for ranging these arrays, are linker-
> generated symbols, which always relocate as R_ARM_ABS32
> even though they are supposed *not* to be absolute.
> 
> V1 of this patch series fixed LGAs so that start or
> end symbols are actually compiler-generated, and thus
> their references are relocated using R_ARM_RELATIVE;
> V2 also fixes crt0 so that BSS start and end references
> do not produce R_ARM_ABS32 relocations either.
> 
> With V2, none of the targets built with MAKEALL -a arm
> produces any R_ARM_ABS32 relocation.
> 
> This series has been build-tested with ARM (295 targets
> clean) and powerpc (634 targets clean)
> 
> Changes in v2:
> - fixed missing .sram memory mapping in OMAP lds
> - removed useless linker script sections in SPL lds files
> - made BSS start and end compiler-generated
> - moved SPL linker script changes to their own commit
> - added KEEP() to all linker files
> - removed spurious change to common/command.c
> - changed empty type from struct {} to char[0]
> - dropped patch to removed board/micronas/vct/u-boot.lds
> - removed all references to u-boot.lst
> 
> Albert ARIBAUD (4):
>   arm: omap: map u_boot_lists section to .sram
>   Remove linker lists (LGAs) from SPL linker scripts
>   arm: make __bss_start and __bss_end__ compiler-generated
>   Refactor linker-generated arrays
> 
>  .gitignore                                       |    1 -
>  Makefile                                         |   13 +-
>  arch/arm/cpu/arm920t/ep93xx/u-boot.lds           |    2 +-
>  arch/arm/cpu/arm926ejs/mxs/u-boot-spl.lds        |    6 -
>  arch/arm/cpu/arm926ejs/spear/u-boot-spl.lds      |    6 -
>  arch/arm/cpu/armv7/am33xx/u-boot-spl.lds         |   67 ++++++
>  arch/arm/cpu/armv7/omap-common/u-boot-spl.lds    |    4 -
>  arch/arm/cpu/ixp/u-boot.lds                      |   14 +-
>  arch/arm/cpu/u-boot-spl.lds                      |   93 ++++++++
>  arch/arm/cpu/u-boot.lds                          |   14 +-
>  arch/arm/lib/Makefile                            |    1 +
>  arch/arm/lib/bss.c                               |   39 ++++
>  arch/avr32/cpu/u-boot.lds                        |    2 +-
>  arch/blackfin/cpu/u-boot.lds                     |    2 +-
>  arch/microblaze/cpu/u-boot.lds                   |    2 +-
>  arch/mips/cpu/u-boot.lds                         |    2 +-
>  arch/nds32/cpu/n1213/u-boot.lds                  |    2 +-
>  arch/nios2/cpu/u-boot.lds                        |    2 +-
>  arch/powerpc/cpu/74xx_7xx/u-boot.lds             |    2 +-
>  arch/powerpc/cpu/mpc512x/u-boot.lds              |    2 +-
>  arch/powerpc/cpu/mpc5xx/u-boot.lds               |    2 +-
>  arch/powerpc/cpu/mpc5xxx/u-boot-customlayout.lds |    2 +-
>  arch/powerpc/cpu/mpc5xxx/u-boot.lds              |    2 +-
>  arch/powerpc/cpu/mpc8220/u-boot.lds              |    2 +-
>  arch/powerpc/cpu/mpc824x/u-boot.lds              |    2 +-
>  arch/powerpc/cpu/mpc8260/u-boot.lds              |    2 +-
>  arch/powerpc/cpu/mpc83xx/u-boot.lds              |    2 +-
>  arch/powerpc/cpu/mpc85xx/u-boot-nand.lds         |    2 +-
>  arch/powerpc/cpu/mpc85xx/u-boot-nand_spl.lds     |    2 +-
>  arch/powerpc/cpu/mpc85xx/u-boot.lds              |    2 +-
>  arch/powerpc/cpu/mpc86xx/u-boot.lds              |    2 +-
>  arch/powerpc/cpu/ppc4xx/u-boot.lds               |    2 +-
>  arch/sandbox/cpu/u-boot.lds                      |    2 +-
>  arch/sh/cpu/sh2/u-boot.lds                       |    2 +-
>  arch/sh/cpu/sh3/u-boot.lds                       |    2 +-
>  arch/sh/cpu/sh4/u-boot.lds                       |    2 +-
>  arch/x86/cpu/u-boot.lds                          |    2 +-
>  board/BuS/eb_cpu5282/u-boot.lds                  |    2 +-
>  board/LEOX/elpt860/u-boot.lds                    |    2 +-
>  board/RPXClassic/u-boot.lds                      |    2 +-
>  board/RPXClassic/u-boot.lds.debug                |    2 +-
>  board/RPXlite/u-boot.lds                         |    2 +-
>  board/RPXlite/u-boot.lds.debug                   |    2 +-
>  board/RPXlite_dw/u-boot.lds                      |    2 +-
>  board/RPXlite_dw/u-boot.lds.debug                |    2 +-
>  board/RRvision/u-boot.lds                        |    2 +-
>  board/actux1/u-boot.lds                          |   24 ++-
>  board/actux2/u-boot.lds                          |   24 ++-
>  board/actux3/u-boot.lds                          |   18 +-
>  board/adder/u-boot.lds                           |    2 +-
>  board/ait/cam_enc_4xx/u-boot-spl.lds             |    4 -
>  board/altera/nios2-generic/u-boot.lds            |    2 +-
>  board/amcc/acadia/u-boot-nand.lds                |    2 +-
>  board/amcc/bamboo/u-boot-nand.lds                |    2 +-
>  board/amcc/canyonlands/u-boot-nand.lds           |    2 +-
>  board/amcc/kilauea/u-boot-nand.lds               |    2 +-
>  board/amcc/sequoia/u-boot-nand.lds               |    2 +-
>  board/amcc/sequoia/u-boot-ram.lds                |    2 +-
>  board/astro/mcf5373l/u-boot.lds                  |    2 +-
>  board/cobra5272/u-boot.lds                       |    2 +-
>  board/cogent/u-boot.lds                          |    2 +-
>  board/cogent/u-boot.lds.debug                    |    2 +-
>  board/cray/L1/u-boot.lds.debug                   |    2 +-
>  board/dave/PPChameleonEVB/u-boot.lds             |    2 +-
>  board/davinci/da8xxevm/u-boot-spl-da850evm.lds   |    5 -
>  board/davinci/da8xxevm/u-boot-spl-hawk.lds       |    5 -
>  board/dvlhost/u-boot.lds                         |   18 +-
>  board/eltec/mhpc/u-boot.lds                      |    2 +-
>  board/eltec/mhpc/u-boot.lds.debug                |    2 +-
>  board/emk/top860/u-boot.lds                      |    2 +-
>  board/ep88x/u-boot.lds                           |    2 +-
>  board/esd/dasa_sim/u-boot.lds                    |    2 +-
>  board/esd/pmc440/u-boot-nand.lds                 |    2 +-
>  board/esd/tasreg/u-boot.lds                      |    2 +-
>  board/esteem192e/u-boot.lds                      |    2 +-
>  board/evb64260/u-boot.lds                        |    2 +-
>  board/fads/u-boot.lds                            |    2 +-
>  board/flagadm/u-boot.lds                         |    2 +-
>  board/flagadm/u-boot.lds.debug                   |    2 +-
>  board/freescale/m5208evbe/u-boot.lds             |    2 +-
>  board/freescale/m52277evb/u-boot.lds             |    2 +-
>  board/freescale/m5235evb/u-boot.lds              |    2 +-
>  board/freescale/m5249evb/u-boot.lds              |    2 +-
>  board/freescale/m5253demo/u-boot.lds             |    2 +-
>  board/freescale/m5253evbe/u-boot.lds             |    2 +-
>  board/freescale/m5271evb/u-boot.lds              |    2 +-
>  board/freescale/m5272c3/u-boot.lds               |    2 +-
>  board/freescale/m5275evb/u-boot.lds              |    2 +-
>  board/freescale/m5282evb/u-boot.lds              |    2 +-
>  board/freescale/m53017evb/u-boot.lds             |    2 +-
>  board/freescale/m5329evb/u-boot.lds              |    2 +-
>  board/freescale/m5373evb/u-boot.lds              |    2 +-
>  board/freescale/m54418twr/u-boot.lds             |    2 +-
>  board/freescale/m54451evb/u-boot.lds             |    2 +-
>  board/freescale/m54455evb/u-boot.lds             |    2 +-
>  board/freescale/m547xevb/u-boot.lds              |    2 +-
>  board/freescale/m548xevb/u-boot.lds              |    2 +-
>  board/freescale/mx31ads/u-boot.lds               |   16 +-
>  board/gaisler/gr_cpci_ax2000/u-boot.lds          |    2 +-
>  board/gaisler/gr_ep2s60/u-boot.lds               |    2 +-
>  board/gaisler/gr_xc3s_1500/u-boot.lds            |    2 +-
>  board/gaisler/grsim/u-boot.lds                   |    2 +-
>  board/gaisler/grsim_leon2/u-boot.lds             |    2 +-
>  board/gen860t/u-boot-flashenv.lds                |    2 +-
>  board/gen860t/u-boot.lds                         |    2 +-
>  board/genietv/u-boot.lds                         |    2 +-
>  board/genietv/u-boot.lds.debug                   |    2 +-
>  board/hermes/u-boot.lds                          |    2 +-
>  board/hermes/u-boot.lds.debug                    |    2 +-
>  board/hymod/u-boot.lds                           |    2 +-
>  board/hymod/u-boot.lds.debug                     |    2 +-
>  board/icu862/u-boot.lds                          |    2 +-
>  board/icu862/u-boot.lds.debug                    |    2 +-
>  board/idmr/u-boot.lds                            |    2 +-
>  board/ip860/u-boot.lds                           |    2 +-
>  board/ip860/u-boot.lds.debug                     |    2 +-
>  board/ivm/u-boot.lds                             |    2 +-
>  board/ivm/u-boot.lds.debug                       |    2 +-
>  board/korat/u-boot-F7FC.lds                      |    2 +-
>  board/kup/kup4k/u-boot.lds                       |    2 +-
>  board/kup/kup4k/u-boot.lds.debug                 |    2 +-
>  board/kup/kup4x/u-boot.lds                       |    2 +-
>  board/kup/kup4x/u-boot.lds.debug                 |    2 +-
>  board/lwmon/u-boot.lds                           |    2 +-
>  board/lwmon/u-boot.lds.debug                     |    2 +-
>  board/manroland/uc100/u-boot.lds                 |    2 +-
>  board/matrix_vision/mvsmr/u-boot.lds             |    2 +-
>  board/mbx8xx/u-boot.lds                          |    2 +-
>  board/mbx8xx/u-boot.lds.debug                    |    2 +-
>  board/mousse/u-boot.lds                          |    2 +-
>  board/mpl/pip405/u-boot.lds.debug                |    2 +-
>  board/mvblue/u-boot.lds                          |    2 +-
>  board/netphone/u-boot.lds                        |    2 +-
>  board/netphone/u-boot.lds.debug                  |    2 +-
>  board/netta/u-boot.lds                           |    2 +-
>  board/netta/u-boot.lds.debug                     |    2 +-
>  board/netta2/u-boot.lds                          |    2 +-
>  board/netta2/u-boot.lds.debug                    |    2 +-
>  board/netvia/u-boot.lds                          |    2 +-
>  board/netvia/u-boot.lds.debug                    |    2 +-
>  board/nx823/u-boot.lds                           |    2 +-
>  board/nx823/u-boot.lds.debug                     |    2 +-
>  board/openrisc/openrisc-generic/u-boot.lds       |    2 +-
>  board/quantum/u-boot.lds                         |    2 +-
>  board/r360mpi/u-boot.lds                         |    2 +-
>  board/rbc823/u-boot.lds                          |    2 +-
>  board/renesas/sh7752evb/u-boot.lds               |    2 +-
>  board/renesas/sh7757lcr/u-boot.lds               |    2 +-
>  board/rsdproto/u-boot.lds                        |    2 +-
>  board/samsung/smdk5250/smdk5250-uboot-spl.lds    |    2 +-
>  board/samsung/smdk6400/u-boot-nand.lds           |    2 +-
>  board/sandburst/karef/u-boot.lds.debug           |    2 +-
>  board/sandburst/metrobox/u-boot.lds.debug        |    2 +-
>  board/sandpoint/u-boot.lds                       |    2 +-
>  board/sixnet/u-boot.lds                          |    2 +-
>  board/snmc/qs850/u-boot.lds                      |    2 +-
>  board/snmc/qs860t/u-boot.lds                     |    2 +-
>  board/spc1920/u-boot.lds                         |    2 +-
>  board/spd8xx/u-boot.lds                          |    2 +-
>  board/spd8xx/u-boot.lds.debug                    |    2 +-
>  board/stx/stxxtc/u-boot.lds                      |    2 +-
>  board/stx/stxxtc/u-boot.lds.debug                |    2 +-
>  board/svm_sc8xx/u-boot.lds                       |    2 +-
>  board/tqc/tqm8xx/u-boot.lds                      |    2 +-
>  board/v37/u-boot.lds                             |    2 +-
>  board/vpac270/u-boot-spl.lds                     |    4 -
>  board/w7o/u-boot.lds.debug                       |    2 +-
>  board/xes/xpedite1000/u-boot.lds.debug           |    2 +-
>  common/cmd_help.c                                |    2 +-
>  config.mk                                        |    2 -
>  doc/README.commands                              |   18 +-
>  helper.mk                                        |   64 ------
>  include/command.h                                |    2 +-
>  include/configs/am335x_evm.h                     |    2 +-
>  include/configs/pcm051.h                         |    2 +-
>  include/env_callback.h                           |    2 +-
>  include/linker_lists.h                           |  252 +++++++++++++++++-----
>  nand_spl/board/freescale/mpc8536ds/Makefile      |    7 +-
>  nand_spl/board/freescale/mpc8569mds/Makefile     |    7 +-
>  nand_spl/board/freescale/mpc8572ds/Makefile      |    7 +-
>  nand_spl/board/freescale/mx31pdk/Makefile        |    7 +-
>  nand_spl/board/freescale/mx31pdk/u-boot.lds      |    2 +-
>  nand_spl/board/freescale/p1010rdb/Makefile       |    7 +-
>  nand_spl/board/freescale/p1023rds/Makefile       |    7 +-
>  nand_spl/board/freescale/p1_p2_rdb/Makefile      |    7 +-
>  nand_spl/board/karo/tx25/Makefile                |    7 +-
>  nand_spl/board/karo/tx25/u-boot.lds              |    2 +-
>  nand_spl/board/samsung/smdk6400/u-boot.lds       |    2 +-
>  spl/.gitignore                                   |    1 -
>  spl/Makefile                                     |    8 +-
>  190 files changed, 665 insertions(+), 424 deletions(-)
>  create mode 100644 arch/arm/cpu/armv7/am33xx/u-boot-spl.lds
>  create mode 100644 arch/arm/cpu/u-boot-spl.lds
>  create mode 100644 arch/arm/lib/bss.c
>  delete mode 100644 helper.mk

Applied to u-boot-arm/master.

Amicalement,
diff mbox

Patch

diff --git a/Makefile b/Makefile
index 51bd918..3cff193 100644
--- a/Makefile
+++ b/Makefile
@@ -595,11 +595,7 @@  $(SUBDIR_EXAMPLES): $(obj)u-boot
 $(LDSCRIPT):	depend
 		$(MAKE) -C $(dir $@) $(notdir $@)
 
-# The following line expands into whole rule which generates u-boot.lst,
-# the file containing u-boots LG-array linker section. This is included into
-# $(LDSCRIPT). The function make_u_boot_list is defined in helper.mk file.
-$(eval $(call make_u_boot_list, $(obj)include/u-boot.lst, $(LIBBOARD) $(LIBS)))
-$(obj)u-boot.lds: $(LDSCRIPT) $(obj)include/u-boot.lst
+$(obj)u-boot.lds: $(LDSCRIPT)
 		$(CPP) $(CPPFLAGS) $(LDPPFLAGS) -ansi -D__ASSEMBLY__ -P - <$< >$@
 
 nand_spl:	$(TIMESTAMP_FILE) $(VERSION_FILE) depend
diff --git a/arch/arm/cpu/arm920t/ep93xx/u-boot.lds b/arch/arm/cpu/arm920t/ep93xx/u-boot.lds
index 008ae89..8d371f8 100644
--- a/arch/arm/cpu/arm920t/ep93xx/u-boot.lds
+++ b/arch/arm/cpu/arm920t/ep93xx/u-boot.lds
@@ -51,7 +51,7 @@  SECTIONS
 
 	. = ALIGN(4);
 	.u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
 	}
 
 	. = ALIGN(4);
diff --git a/arch/arm/cpu/arm926ejs/mxs/u-boot-spl.lds b/arch/arm/cpu/arm926ejs/mxs/u-boot-spl.lds
index 6dc681a..ba33978 100644
--- a/arch/arm/cpu/arm926ejs/mxs/u-boot-spl.lds
+++ b/arch/arm/cpu/arm926ejs/mxs/u-boot-spl.lds
@@ -52,7 +52,7 @@  SECTIONS
 	. = ALIGN(4);
 
 	.u_boot_list : {
-		#include <u-boot.lst>
+		*(SORT(.u_boot_list*));
 	}
 
 	. = ALIGN(4);
diff --git a/arch/arm/cpu/arm926ejs/spear/u-boot-spl.lds b/arch/arm/cpu/arm926ejs/spear/u-boot-spl.lds
index f3bd5e7..ae23ddd 100644
--- a/arch/arm/cpu/arm926ejs/spear/u-boot-spl.lds
+++ b/arch/arm/cpu/arm926ejs/spear/u-boot-spl.lds
@@ -52,7 +52,7 @@  SECTIONS
 	. = ALIGN(4);
 
 	.u_boot_list : {
-		#include <u-boot.lst>
+		*(SORT(.u_boot_list*));
 	}
 
 	. = ALIGN(4);
diff --git a/arch/arm/cpu/armv7/omap-common/u-boot-spl.lds b/arch/arm/cpu/armv7/omap-common/u-boot-spl.lds
index 9979c30..aefaccc 100644
--- a/arch/arm/cpu/armv7/omap-common/u-boot-spl.lds
+++ b/arch/arm/cpu/armv7/omap-common/u-boot-spl.lds
@@ -49,7 +49,7 @@  SECTIONS
 	.data : { *(SORT_BY_ALIGNMENT(.data*)) } >.sram
 
 	.u_boot_list : {
-		#include <u-boot.lst>
+		*(SORT(.u_boot_list*));
 	}
 
 	. = ALIGN(4);
diff --git a/arch/arm/cpu/ixp/u-boot.lds b/arch/arm/cpu/ixp/u-boot.lds
index 81d954f..2adfe5b 100644
--- a/arch/arm/cpu/ixp/u-boot.lds
+++ b/arch/arm/cpu/ixp/u-boot.lds
@@ -49,7 +49,7 @@  SECTIONS
 
 	. = ALIGN(4);
 	.u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
 	}
 
 	. = ALIGN(4);
diff --git a/arch/arm/cpu/u-boot.lds b/arch/arm/cpu/u-boot.lds
index e6b202b..466eb04 100644
--- a/arch/arm/cpu/u-boot.lds
+++ b/arch/arm/cpu/u-boot.lds
@@ -52,7 +52,7 @@  SECTIONS
 
 	. = ALIGN(4);
 	.u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
 	}
 
 	. = ALIGN(4);
diff --git a/arch/avr32/cpu/u-boot.lds b/arch/avr32/cpu/u-boot.lds
index 0b16d2a..ad4003f 100644
--- a/arch/avr32/cpu/u-boot.lds
+++ b/arch/avr32/cpu/u-boot.lds
@@ -50,7 +50,7 @@  SECTIONS
 
 	. = ALIGN(4);
 	.u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
 	}
 
 	. = ALIGN(4);
diff --git a/arch/blackfin/cpu/u-boot.lds b/arch/blackfin/cpu/u-boot.lds
index 58db838..88b1eaf 100644
--- a/arch/blackfin/cpu/u-boot.lds
+++ b/arch/blackfin/cpu/u-boot.lds
@@ -114,7 +114,7 @@  SECTIONS
 
 
 	.u_boot_list : {
-		#include <u-boot.lst>
+		*(SORT(.u_boot_list*));
 	} >ram_data
 
 	.text_l1 :
diff --git a/arch/microblaze/cpu/u-boot.lds b/arch/microblaze/cpu/u-boot.lds
index fe3d97d..e1fab9f 100644
--- a/arch/microblaze/cpu/u-boot.lds
+++ b/arch/microblaze/cpu/u-boot.lds
@@ -54,7 +54,7 @@  SECTIONS
 
 	. = ALIGN(4);
 	.u_boot_list : {
-		#include <u-boot.lst>
+		*(SORT(.u_boot_list*));
 	}
 
 	.bss ALIGN(0x4):
diff --git a/arch/mips/cpu/u-boot.lds b/arch/mips/cpu/u-boot.lds
index 37c9d23..6571518 100644
--- a/arch/mips/cpu/u-boot.lds
+++ b/arch/mips/cpu/u-boot.lds
@@ -64,7 +64,7 @@  SECTIONS
 
 	. = ALIGN(4);
 	.u_boot_list : {
-		#include <u-boot.lst>
+		*(SORT(.u_boot_list*));
 	}
 
 	uboot_end_data = .;
diff --git a/arch/nds32/cpu/n1213/u-boot.lds b/arch/nds32/cpu/n1213/u-boot.lds
index cef19c5..4516b45 100644
--- a/arch/nds32/cpu/n1213/u-boot.lds
+++ b/arch/nds32/cpu/n1213/u-boot.lds
@@ -55,7 +55,7 @@  SECTIONS
 
 	. = ALIGN(4);
 	.u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
 	}
 
 	. = ALIGN(4);
diff --git a/arch/nios2/cpu/u-boot.lds b/arch/nios2/cpu/u-boot.lds
index d0eb80d..a879f5b 100644
--- a/arch/nios2/cpu/u-boot.lds
+++ b/arch/nios2/cpu/u-boot.lds
@@ -48,7 +48,7 @@  SECTIONS
 
 	. = ALIGN(4);
 	.u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
 	}
 
 	/* INIT DATA sections - "Small" data (see the gcc -G option)
diff --git a/arch/powerpc/cpu/74xx_7xx/u-boot.lds b/arch/powerpc/cpu/74xx_7xx/u-boot.lds
index ecee439..666e72e 100644
--- a/arch/powerpc/cpu/74xx_7xx/u-boot.lds
+++ b/arch/powerpc/cpu/74xx_7xx/u-boot.lds
@@ -65,7 +65,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/arch/powerpc/cpu/mpc512x/u-boot.lds b/arch/powerpc/cpu/mpc512x/u-boot.lds
index 7faefba..b6eaef0 100644
--- a/arch/powerpc/cpu/mpc512x/u-boot.lds
+++ b/arch/powerpc/cpu/mpc512x/u-boot.lds
@@ -60,7 +60,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/arch/powerpc/cpu/mpc5xx/u-boot.lds b/arch/powerpc/cpu/mpc5xx/u-boot.lds
index c91e146..30512e5 100644
--- a/arch/powerpc/cpu/mpc5xx/u-boot.lds
+++ b/arch/powerpc/cpu/mpc5xx/u-boot.lds
@@ -68,7 +68,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/arch/powerpc/cpu/mpc5xxx/u-boot-customlayout.lds b/arch/powerpc/cpu/mpc5xxx/u-boot-customlayout.lds
index ac7844d..a75d137 100644
--- a/arch/powerpc/cpu/mpc5xxx/u-boot-customlayout.lds
+++ b/arch/powerpc/cpu/mpc5xxx/u-boot-customlayout.lds
@@ -68,7 +68,7 @@  SECTIONS
   . = .;
 
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
   . = .;
diff --git a/arch/powerpc/cpu/mpc5xxx/u-boot.lds b/arch/powerpc/cpu/mpc5xxx/u-boot.lds
index 1f46ead..bc54535 100644
--- a/arch/powerpc/cpu/mpc5xxx/u-boot.lds
+++ b/arch/powerpc/cpu/mpc5xxx/u-boot.lds
@@ -63,7 +63,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/arch/powerpc/cpu/mpc8220/u-boot.lds b/arch/powerpc/cpu/mpc8220/u-boot.lds
index c147954..f40079e 100644
--- a/arch/powerpc/cpu/mpc8220/u-boot.lds
+++ b/arch/powerpc/cpu/mpc8220/u-boot.lds
@@ -62,7 +62,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/arch/powerpc/cpu/mpc824x/u-boot.lds b/arch/powerpc/cpu/mpc824x/u-boot.lds
index a713012..fefd3a8 100644
--- a/arch/powerpc/cpu/mpc824x/u-boot.lds
+++ b/arch/powerpc/cpu/mpc824x/u-boot.lds
@@ -63,7 +63,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/arch/powerpc/cpu/mpc8260/u-boot.lds b/arch/powerpc/cpu/mpc8260/u-boot.lds
index 42385fc..17c9f5b 100644
--- a/arch/powerpc/cpu/mpc8260/u-boot.lds
+++ b/arch/powerpc/cpu/mpc8260/u-boot.lds
@@ -62,7 +62,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/arch/powerpc/cpu/mpc83xx/u-boot.lds b/arch/powerpc/cpu/mpc83xx/u-boot.lds
index d699def..cd63f86 100644
--- a/arch/powerpc/cpu/mpc83xx/u-boot.lds
+++ b/arch/powerpc/cpu/mpc83xx/u-boot.lds
@@ -61,7 +61,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/arch/powerpc/cpu/mpc85xx/u-boot-nand.lds b/arch/powerpc/cpu/mpc85xx/u-boot-nand.lds
index f7c4a22..bf9d7f3 100644
--- a/arch/powerpc/cpu/mpc85xx/u-boot-nand.lds
+++ b/arch/powerpc/cpu/mpc85xx/u-boot-nand.lds
@@ -72,7 +72,7 @@  SECTIONS
   . = .;
 
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
   . = .;
diff --git a/arch/powerpc/cpu/mpc85xx/u-boot-nand_spl.lds b/arch/powerpc/cpu/mpc85xx/u-boot-nand_spl.lds
index 46dbaed..94efe76 100644
--- a/arch/powerpc/cpu/mpc85xx/u-boot-nand_spl.lds
+++ b/arch/powerpc/cpu/mpc85xx/u-boot-nand_spl.lds
@@ -54,7 +54,7 @@  SECTIONS
 	_edata  =  .;
 
 	.u_boot_list : {
-		#include <u-boot.lst>
+		*(SORT(.u_boot_list*));
 	}
 
 	. = ALIGN(8);
diff --git a/arch/powerpc/cpu/mpc85xx/u-boot.lds b/arch/powerpc/cpu/mpc85xx/u-boot.lds
index 4a40a1f..494c9de 100644
--- a/arch/powerpc/cpu/mpc85xx/u-boot.lds
+++ b/arch/powerpc/cpu/mpc85xx/u-boot.lds
@@ -80,7 +80,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
   . = .;
diff --git a/arch/powerpc/cpu/mpc86xx/u-boot.lds b/arch/powerpc/cpu/mpc86xx/u-boot.lds
index 8bfadf2..5360ad2 100644
--- a/arch/powerpc/cpu/mpc86xx/u-boot.lds
+++ b/arch/powerpc/cpu/mpc86xx/u-boot.lds
@@ -67,7 +67,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
   . = .;
diff --git a/arch/powerpc/cpu/ppc4xx/u-boot.lds b/arch/powerpc/cpu/ppc4xx/u-boot.lds
index a96ddd5..0a673b6 100644
--- a/arch/powerpc/cpu/ppc4xx/u-boot.lds
+++ b/arch/powerpc/cpu/ppc4xx/u-boot.lds
@@ -81,7 +81,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
   . = .;
diff --git a/arch/sandbox/cpu/u-boot.lds b/arch/sandbox/cpu/u-boot.lds
index 1b781eb..544f37b 100644
--- a/arch/sandbox/cpu/u-boot.lds
+++ b/arch/sandbox/cpu/u-boot.lds
@@ -27,7 +27,7 @@  SECTIONS
 
 	. = ALIGN(4);
 	.u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
 	}
 
 	__u_boot_sandbox_option_start = .;
diff --git a/arch/sh/cpu/sh2/u-boot.lds b/arch/sh/cpu/sh2/u-boot.lds
index 17f8091..32cfdb4 100644
--- a/arch/sh/cpu/sh2/u-boot.lds
+++ b/arch/sh/cpu/sh2/u-boot.lds
@@ -74,7 +74,7 @@  SECTIONS
 
 
 	.u_boot_list : {
-		#include <u-boot.lst>
+		*(SORT(.u_boot_list*));
 	}
 
 	PROVIDE (reloc_dst_end = .);
diff --git a/arch/sh/cpu/sh3/u-boot.lds b/arch/sh/cpu/sh3/u-boot.lds
index c831961..e01b61c 100644
--- a/arch/sh/cpu/sh3/u-boot.lds
+++ b/arch/sh/cpu/sh3/u-boot.lds
@@ -80,7 +80,7 @@  SECTIONS
 
 
 	.u_boot_list : {
-		#include <u-boot.lst>
+		*(SORT(.u_boot_list*));
 	}
 
 	PROVIDE (reloc_dst_end = .);
diff --git a/arch/sh/cpu/sh4/u-boot.lds b/arch/sh/cpu/sh4/u-boot.lds
index 0ecafcf..1a2c592 100644
--- a/arch/sh/cpu/sh4/u-boot.lds
+++ b/arch/sh/cpu/sh4/u-boot.lds
@@ -77,7 +77,7 @@  SECTIONS
 
 
 	.u_boot_list : {
-		#include <u-boot.lst>
+		*(SORT(.u_boot_list*));
 	}
 
 	PROVIDE (reloc_dst_end = .);
diff --git a/arch/x86/cpu/u-boot.lds b/arch/x86/cpu/u-boot.lds
index 0c6f0e3..6cc881e 100644
--- a/arch/x86/cpu/u-boot.lds
+++ b/arch/x86/cpu/u-boot.lds
@@ -36,7 +36,7 @@  SECTIONS
 
 	. = ALIGN(4);
 	.u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
 	}
 
 	. = ALIGN(4);
diff --git a/board/BuS/eb_cpu5282/u-boot.lds b/board/BuS/eb_cpu5282/u-boot.lds
index 0c92d31..a8a9fcb 100644
--- a/board/BuS/eb_cpu5282/u-boot.lds
+++ b/board/BuS/eb_cpu5282/u-boot.lds
@@ -68,7 +68,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
   . = .;
diff --git a/board/LEOX/elpt860/u-boot.lds b/board/LEOX/elpt860/u-boot.lds
index 2bb876d..2989172 100644
--- a/board/LEOX/elpt860/u-boot.lds
+++ b/board/LEOX/elpt860/u-boot.lds
@@ -89,7 +89,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
   . = .;
diff --git a/board/RPXClassic/u-boot.lds b/board/RPXClassic/u-boot.lds
index 18f962c..9fba835 100644
--- a/board/RPXClassic/u-boot.lds
+++ b/board/RPXClassic/u-boot.lds
@@ -69,7 +69,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/RPXlite/u-boot.lds b/board/RPXlite/u-boot.lds
index 18f962c..9fba835 100644
--- a/board/RPXlite/u-boot.lds
+++ b/board/RPXlite/u-boot.lds
@@ -69,7 +69,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/RPXlite_dw/u-boot.lds b/board/RPXlite_dw/u-boot.lds
index 18f962c..9fba835 100644
--- a/board/RPXlite_dw/u-boot.lds
+++ b/board/RPXlite_dw/u-boot.lds
@@ -69,7 +69,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/RRvision/u-boot.lds b/board/RRvision/u-boot.lds
index 748e511..6d957ad 100644
--- a/board/RRvision/u-boot.lds
+++ b/board/RRvision/u-boot.lds
@@ -74,7 +74,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/actux1/u-boot.lds b/board/actux1/u-boot.lds
index c41eed0..daa5ed2 100644
--- a/board/actux1/u-boot.lds
+++ b/board/actux1/u-boot.lds
@@ -57,7 +57,7 @@  SECTIONS
 
 	. = ALIGN(4);
 	.u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
 	}
 
 	. = ALIGN (4);
diff --git a/board/actux2/u-boot.lds b/board/actux2/u-boot.lds
index 8409984..24ab013 100644
--- a/board/actux2/u-boot.lds
+++ b/board/actux2/u-boot.lds
@@ -57,7 +57,7 @@  SECTIONS
 
 	. = ALIGN(4);
 	.u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
 	}
 
 	. = ALIGN (4);
diff --git a/board/actux3/u-boot.lds b/board/actux3/u-boot.lds
index a3bd02b..114a5c2 100644
--- a/board/actux3/u-boot.lds
+++ b/board/actux3/u-boot.lds
@@ -57,7 +57,7 @@  SECTIONS
 
 	. = ALIGN(4);
 	.u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
 	}
 
 	. = ALIGN (4);
diff --git a/board/adder/u-boot.lds b/board/adder/u-boot.lds
index 73e2f3f..01a1d01 100644
--- a/board/adder/u-boot.lds
+++ b/board/adder/u-boot.lds
@@ -65,7 +65,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/ait/cam_enc_4xx/u-boot-spl.lds b/board/ait/cam_enc_4xx/u-boot-spl.lds
index 656b2fb..70d4ab7 100644
--- a/board/ait/cam_enc_4xx/u-boot-spl.lds
+++ b/board/ait/cam_enc_4xx/u-boot-spl.lds
@@ -49,7 +49,7 @@  SECTIONS
 	.data : { *(SORT_BY_ALIGNMENT(.data*)) } >.sram
 	. = ALIGN(4);
 	.u_boot_list : {
-		#include <u-boot.lst>
+		*(SORT(.u_boot_list*));
 	} >.sram
 	. = ALIGN(4);
 	.rel.dyn : {
diff --git a/board/altera/nios2-generic/u-boot.lds b/board/altera/nios2-generic/u-boot.lds
index 289386b..c65277c 100644
--- a/board/altera/nios2-generic/u-boot.lds
+++ b/board/altera/nios2-generic/u-boot.lds
@@ -49,7 +49,7 @@  SECTIONS
 
 	. = ALIGN(4);
 	.u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
 	}
 
 	/* INIT DATA sections - "Small" data (see the gcc -G option)
diff --git a/board/amcc/acadia/u-boot-nand.lds b/board/amcc/acadia/u-boot-nand.lds
index beba978..b02b7cc 100644
--- a/board/amcc/acadia/u-boot-nand.lds
+++ b/board/amcc/acadia/u-boot-nand.lds
@@ -74,7 +74,7 @@  SECTIONS
   . = .;
 
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
   . = .;
diff --git a/board/amcc/bamboo/u-boot-nand.lds b/board/amcc/bamboo/u-boot-nand.lds
index 2dd00d7..7d12808 100644
--- a/board/amcc/bamboo/u-boot-nand.lds
+++ b/board/amcc/bamboo/u-boot-nand.lds
@@ -75,7 +75,7 @@  SECTIONS
   . = .;
 
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
   . = .;
diff --git a/board/amcc/canyonlands/u-boot-nand.lds b/board/amcc/canyonlands/u-boot-nand.lds
index 8ac5116..9fa29f0 100644
--- a/board/amcc/canyonlands/u-boot-nand.lds
+++ b/board/amcc/canyonlands/u-boot-nand.lds
@@ -75,7 +75,7 @@  SECTIONS
   . = .;
 
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
   . = .;
diff --git a/board/amcc/kilauea/u-boot-nand.lds b/board/amcc/kilauea/u-boot-nand.lds
index beba978..b02b7cc 100644
--- a/board/amcc/kilauea/u-boot-nand.lds
+++ b/board/amcc/kilauea/u-boot-nand.lds
@@ -74,7 +74,7 @@  SECTIONS
   . = .;
 
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
   . = .;
diff --git a/board/amcc/sequoia/u-boot-nand.lds b/board/amcc/sequoia/u-boot-nand.lds
index 18266ef..9ad41a0 100644
--- a/board/amcc/sequoia/u-boot-nand.lds
+++ b/board/amcc/sequoia/u-boot-nand.lds
@@ -75,7 +75,7 @@  SECTIONS
   . = .;
 
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
   . = .;
diff --git a/board/amcc/sequoia/u-boot-ram.lds b/board/amcc/sequoia/u-boot-ram.lds
index 6b02784..ee30dc0 100644
--- a/board/amcc/sequoia/u-boot-ram.lds
+++ b/board/amcc/sequoia/u-boot-ram.lds
@@ -66,7 +66,7 @@  SECTIONS
   . = .;
 
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
   . = .;
diff --git a/board/astro/mcf5373l/u-boot.lds b/board/astro/mcf5373l/u-boot.lds
index bc40fd6..dce1f13 100644
--- a/board/astro/mcf5373l/u-boot.lds
+++ b/board/astro/mcf5373l/u-boot.lds
@@ -72,7 +72,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
   . = .;
diff --git a/board/cobra5272/u-boot.lds b/board/cobra5272/u-boot.lds
index d054f20..9cd5e13 100644
--- a/board/cobra5272/u-boot.lds
+++ b/board/cobra5272/u-boot.lds
@@ -71,7 +71,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
   . = .;
diff --git a/board/cogent/u-boot.lds b/board/cogent/u-boot.lds
index 2a6027f..edafbba 100644
--- a/board/cogent/u-boot.lds
+++ b/board/cogent/u-boot.lds
@@ -73,7 +73,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/dave/PPChameleonEVB/u-boot.lds b/board/dave/PPChameleonEVB/u-boot.lds
index 8a306d6..34125c7 100644
--- a/board/dave/PPChameleonEVB/u-boot.lds
+++ b/board/dave/PPChameleonEVB/u-boot.lds
@@ -77,7 +77,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
   . = .;
diff --git a/board/davinci/da8xxevm/u-boot-spl-da850evm.lds b/board/davinci/da8xxevm/u-boot-spl-da850evm.lds
index c5fd93c..117b117 100644
--- a/board/davinci/da8xxevm/u-boot-spl-da850evm.lds
+++ b/board/davinci/da8xxevm/u-boot-spl-da850evm.lds
@@ -50,7 +50,7 @@  SECTIONS
 
 	. = ALIGN(4);
 	.u_boot_list : {
-		#include <u-boot.lst>
+		*(SORT(.u_boot_list*));
 	} >.sram
 
 	. = ALIGN(4);
diff --git a/board/davinci/da8xxevm/u-boot-spl-hawk.lds b/board/davinci/da8xxevm/u-boot-spl-hawk.lds
index 86dc172..9ef2205 100644
--- a/board/davinci/da8xxevm/u-boot-spl-hawk.lds
+++ b/board/davinci/da8xxevm/u-boot-spl-hawk.lds
@@ -59,7 +59,7 @@  SECTIONS
 
 	. = ALIGN(4);
 	.u_boot_list : {
-		#include <u-boot.lst>
+		*(SORT(.u_boot_list*));
 	}
 
 	. = ALIGN(4);
diff --git a/board/dvlhost/u-boot.lds b/board/dvlhost/u-boot.lds
index 1bd1700..ce3123b 100644
--- a/board/dvlhost/u-boot.lds
+++ b/board/dvlhost/u-boot.lds
@@ -57,7 +57,7 @@  SECTIONS
 
 	. = ALIGN(4);
 	.u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
 	}
 
 	. = ALIGN (4);
diff --git a/board/eltec/mhpc/u-boot.lds b/board/eltec/mhpc/u-boot.lds
index c8d3894..4d7ca31 100644
--- a/board/eltec/mhpc/u-boot.lds
+++ b/board/eltec/mhpc/u-boot.lds
@@ -69,7 +69,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/emk/top860/u-boot.lds b/board/emk/top860/u-boot.lds
index 22626d3..0ca7082 100644
--- a/board/emk/top860/u-boot.lds
+++ b/board/emk/top860/u-boot.lds
@@ -70,7 +70,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/ep88x/u-boot.lds b/board/ep88x/u-boot.lds
index 1dcc22a..520e863 100644
--- a/board/ep88x/u-boot.lds
+++ b/board/ep88x/u-boot.lds
@@ -65,7 +65,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/esd/dasa_sim/u-boot.lds b/board/esd/dasa_sim/u-boot.lds
index 7eca183..0731921 100644
--- a/board/esd/dasa_sim/u-boot.lds
+++ b/board/esd/dasa_sim/u-boot.lds
@@ -76,7 +76,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/esd/pmc440/u-boot-nand.lds b/board/esd/pmc440/u-boot-nand.lds
index ca7df45..2edd082 100644
--- a/board/esd/pmc440/u-boot-nand.lds
+++ b/board/esd/pmc440/u-boot-nand.lds
@@ -104,7 +104,7 @@  SECTIONS
   . = .;
 
   .u_boot_list : {
-		#include <u-boot.lst>
+		*(SORT(.u_boot_list*));
   }
 
   . = .;
diff --git a/board/esd/tasreg/u-boot.lds b/board/esd/tasreg/u-boot.lds
index 0d6a0f3..23021b2 100644
--- a/board/esd/tasreg/u-boot.lds
+++ b/board/esd/tasreg/u-boot.lds
@@ -68,7 +68,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
   . = .;
diff --git a/board/esteem192e/u-boot.lds b/board/esteem192e/u-boot.lds
index fe5cf09..d20b2f2 100644
--- a/board/esteem192e/u-boot.lds
+++ b/board/esteem192e/u-boot.lds
@@ -77,7 +77,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/evb64260/u-boot.lds b/board/evb64260/u-boot.lds
index eac9c07..61c9669 100644
--- a/board/evb64260/u-boot.lds
+++ b/board/evb64260/u-boot.lds
@@ -73,7 +73,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/fads/u-boot.lds b/board/fads/u-boot.lds
index 6022dbc..4fd08a7 100644
--- a/board/fads/u-boot.lds
+++ b/board/fads/u-boot.lds
@@ -71,7 +71,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/flagadm/u-boot.lds b/board/flagadm/u-boot.lds
index c8d3894..4d7ca31 100644
--- a/board/flagadm/u-boot.lds
+++ b/board/flagadm/u-boot.lds
@@ -69,7 +69,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/freescale/m5208evbe/u-boot.lds b/board/freescale/m5208evbe/u-boot.lds
index 2c151f2..bd4a6bf 100644
--- a/board/freescale/m5208evbe/u-boot.lds
+++ b/board/freescale/m5208evbe/u-boot.lds
@@ -72,7 +72,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
   . = .;
diff --git a/board/freescale/m52277evb/u-boot.lds b/board/freescale/m52277evb/u-boot.lds
index dbd6f6a..a0f84c3 100644
--- a/board/freescale/m52277evb/u-boot.lds
+++ b/board/freescale/m52277evb/u-boot.lds
@@ -71,7 +71,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
   . = .;
diff --git a/board/freescale/m5235evb/u-boot.lds b/board/freescale/m5235evb/u-boot.lds
index 00932ae..64eff29 100644
--- a/board/freescale/m5235evb/u-boot.lds
+++ b/board/freescale/m5235evb/u-boot.lds
@@ -71,7 +71,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
   . = .;
diff --git a/board/freescale/m5249evb/u-boot.lds b/board/freescale/m5249evb/u-boot.lds
index d054f20..9cd5e13 100644
--- a/board/freescale/m5249evb/u-boot.lds
+++ b/board/freescale/m5249evb/u-boot.lds
@@ -71,7 +71,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
   . = .;
diff --git a/board/freescale/m5253demo/u-boot.lds b/board/freescale/m5253demo/u-boot.lds
index f8116f6..e05479d 100644
--- a/board/freescale/m5253demo/u-boot.lds
+++ b/board/freescale/m5253demo/u-boot.lds
@@ -72,7 +72,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
   . = .;
diff --git a/board/freescale/m5253evbe/u-boot.lds b/board/freescale/m5253evbe/u-boot.lds
index d054f20..9cd5e13 100644
--- a/board/freescale/m5253evbe/u-boot.lds
+++ b/board/freescale/m5253evbe/u-boot.lds
@@ -71,7 +71,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
   . = .;
diff --git a/board/freescale/m5271evb/u-boot.lds b/board/freescale/m5271evb/u-boot.lds
index 133ec01..f877ccc 100644
--- a/board/freescale/m5271evb/u-boot.lds
+++ b/board/freescale/m5271evb/u-boot.lds
@@ -71,7 +71,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
   . = .;
diff --git a/board/freescale/m5272c3/u-boot.lds b/board/freescale/m5272c3/u-boot.lds
index d054f20..9cd5e13 100644
--- a/board/freescale/m5272c3/u-boot.lds
+++ b/board/freescale/m5272c3/u-boot.lds
@@ -71,7 +71,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
   . = .;
diff --git a/board/freescale/m5275evb/u-boot.lds b/board/freescale/m5275evb/u-boot.lds
index fc68de1..759c10f 100644
--- a/board/freescale/m5275evb/u-boot.lds
+++ b/board/freescale/m5275evb/u-boot.lds
@@ -71,7 +71,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
   . = .;
diff --git a/board/freescale/m5282evb/u-boot.lds b/board/freescale/m5282evb/u-boot.lds
index ad49874..0311fbb 100644
--- a/board/freescale/m5282evb/u-boot.lds
+++ b/board/freescale/m5282evb/u-boot.lds
@@ -71,7 +71,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
   . = .;
diff --git a/board/freescale/m53017evb/u-boot.lds b/board/freescale/m53017evb/u-boot.lds
index d25a36f..b79cabd 100644
--- a/board/freescale/m53017evb/u-boot.lds
+++ b/board/freescale/m53017evb/u-boot.lds
@@ -74,7 +74,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
   . = .;
diff --git a/board/freescale/m5329evb/u-boot.lds b/board/freescale/m5329evb/u-boot.lds
index 6616594..631ad26 100644
--- a/board/freescale/m5329evb/u-boot.lds
+++ b/board/freescale/m5329evb/u-boot.lds
@@ -72,7 +72,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
   . = .;
diff --git a/board/freescale/m5373evb/u-boot.lds b/board/freescale/m5373evb/u-boot.lds
index bc40fd6..dce1f13 100644
--- a/board/freescale/m5373evb/u-boot.lds
+++ b/board/freescale/m5373evb/u-boot.lds
@@ -72,7 +72,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
   . = .;
diff --git a/board/freescale/m54418twr/u-boot.lds b/board/freescale/m54418twr/u-boot.lds
index 36a4c26..263c7c0 100644
--- a/board/freescale/m54418twr/u-boot.lds
+++ b/board/freescale/m54418twr/u-boot.lds
@@ -69,7 +69,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
   . = .;
diff --git a/board/freescale/m54451evb/u-boot.lds b/board/freescale/m54451evb/u-boot.lds
index 91328a4..86d97d2 100644
--- a/board/freescale/m54451evb/u-boot.lds
+++ b/board/freescale/m54451evb/u-boot.lds
@@ -69,7 +69,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
   . = .;
diff --git a/board/freescale/m54455evb/u-boot.lds b/board/freescale/m54455evb/u-boot.lds
index 36a4c26..263c7c0 100644
--- a/board/freescale/m54455evb/u-boot.lds
+++ b/board/freescale/m54455evb/u-boot.lds
@@ -69,7 +69,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
   . = .;
diff --git a/board/freescale/m547xevb/u-boot.lds b/board/freescale/m547xevb/u-boot.lds
index de4d0eb..d269d93 100644
--- a/board/freescale/m547xevb/u-boot.lds
+++ b/board/freescale/m547xevb/u-boot.lds
@@ -69,7 +69,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
   . = .;
diff --git a/board/freescale/m548xevb/u-boot.lds b/board/freescale/m548xevb/u-boot.lds
index fbbe0c5..1c87bbc 100644
--- a/board/freescale/m548xevb/u-boot.lds
+++ b/board/freescale/m548xevb/u-boot.lds
@@ -69,7 +69,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
   . = .;
diff --git a/board/freescale/mx31ads/u-boot.lds b/board/freescale/mx31ads/u-boot.lds
index 5267729..cf52091 100644
--- a/board/freescale/mx31ads/u-boot.lds
+++ b/board/freescale/mx31ads/u-boot.lds
@@ -60,7 +60,7 @@  SECTIONS
 
 	. = ALIGN(4);
 	.u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
 	}
 
 	. = ALIGN(4);
diff --git a/board/gaisler/gr_cpci_ax2000/u-boot.lds b/board/gaisler/gr_cpci_ax2000/u-boot.lds
index 774c494..fc9d79d 100644
--- a/board/gaisler/gr_cpci_ax2000/u-boot.lds
+++ b/board/gaisler/gr_cpci_ax2000/u-boot.lds
@@ -88,7 +88,7 @@  SECTIONS
 
 	. = ALIGN(4);
 	.u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
 	}
 
 	.data	:
diff --git a/board/gaisler/gr_ep2s60/u-boot.lds b/board/gaisler/gr_ep2s60/u-boot.lds
index f6d1301..33f32ea 100644
--- a/board/gaisler/gr_ep2s60/u-boot.lds
+++ b/board/gaisler/gr_ep2s60/u-boot.lds
@@ -88,7 +88,7 @@  SECTIONS
 
 	. = ALIGN(4);
 	.u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
 	}
 
 	.data	:
diff --git a/board/gaisler/gr_xc3s_1500/u-boot.lds b/board/gaisler/gr_xc3s_1500/u-boot.lds
index 7df6e83..84859fe 100644
--- a/board/gaisler/gr_xc3s_1500/u-boot.lds
+++ b/board/gaisler/gr_xc3s_1500/u-boot.lds
@@ -88,7 +88,7 @@  SECTIONS
 
 	. = ALIGN(4);
 	.u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
 	}
 
 	.data	:
diff --git a/board/gaisler/grsim/u-boot.lds b/board/gaisler/grsim/u-boot.lds
index b241cbc..81dc5b1 100644
--- a/board/gaisler/grsim/u-boot.lds
+++ b/board/gaisler/grsim/u-boot.lds
@@ -87,7 +87,7 @@  SECTIONS
 
 	. = ALIGN(4);
 	.u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
 	}
 
 	.data	:
diff --git a/board/gaisler/grsim_leon2/u-boot.lds b/board/gaisler/grsim_leon2/u-boot.lds
index 63c15b9..d6ecd8b 100644
--- a/board/gaisler/grsim_leon2/u-boot.lds
+++ b/board/gaisler/grsim_leon2/u-boot.lds
@@ -87,7 +87,7 @@  SECTIONS
 
 	. = ALIGN(4);
 	.u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
 	}
 
 	.data	:
diff --git a/board/gen860t/u-boot-flashenv.lds b/board/gen860t/u-boot-flashenv.lds
index 1cbe7e3..dad73ac 100644
--- a/board/gen860t/u-boot-flashenv.lds
+++ b/board/gen860t/u-boot-flashenv.lds
@@ -73,7 +73,7 @@  SECTIONS
   . = .;
 
   .u_boot_list : {
-		#include <u-boot.lst>
+		*(SORT(.u_boot_list*));
   }
 
   . = .;
diff --git a/board/gen860t/u-boot.lds b/board/gen860t/u-boot.lds
index dd89c70..e0a3f08 100644
--- a/board/gen860t/u-boot.lds
+++ b/board/gen860t/u-boot.lds
@@ -74,7 +74,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/genietv/u-boot.lds b/board/genietv/u-boot.lds
index 124b183..b3dd3fc 100644
--- a/board/genietv/u-boot.lds
+++ b/board/genietv/u-boot.lds
@@ -83,7 +83,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/hermes/u-boot.lds b/board/hermes/u-boot.lds
index f02eb1c..1cdd062 100644
--- a/board/hermes/u-boot.lds
+++ b/board/hermes/u-boot.lds
@@ -75,7 +75,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/hymod/u-boot.lds b/board/hymod/u-boot.lds
index 7afae0a..28b0047 100644
--- a/board/hymod/u-boot.lds
+++ b/board/hymod/u-boot.lds
@@ -113,7 +113,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/icu862/u-boot.lds b/board/icu862/u-boot.lds
index 6778eb1..7701c64 100644
--- a/board/icu862/u-boot.lds
+++ b/board/icu862/u-boot.lds
@@ -69,7 +69,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/idmr/u-boot.lds b/board/idmr/u-boot.lds
index 0d6a0f3..23021b2 100644
--- a/board/idmr/u-boot.lds
+++ b/board/idmr/u-boot.lds
@@ -68,7 +68,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
   . = .;
diff --git a/board/ip860/u-boot.lds b/board/ip860/u-boot.lds
index 18f962c..9fba835 100644
--- a/board/ip860/u-boot.lds
+++ b/board/ip860/u-boot.lds
@@ -69,7 +69,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/ivm/u-boot.lds b/board/ivm/u-boot.lds
index 4cca652..0b09114 100644
--- a/board/ivm/u-boot.lds
+++ b/board/ivm/u-boot.lds
@@ -69,7 +69,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/korat/u-boot-F7FC.lds b/board/korat/u-boot-F7FC.lds
index 033cff4..3b62328 100644
--- a/board/korat/u-boot-F7FC.lds
+++ b/board/korat/u-boot-F7FC.lds
@@ -110,7 +110,7 @@  SECTIONS
   . = .;
 
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
   . = .;
diff --git a/board/kup/kup4k/u-boot.lds b/board/kup/kup4k/u-boot.lds
index 18f962c..9fba835 100644
--- a/board/kup/kup4k/u-boot.lds
+++ b/board/kup/kup4k/u-boot.lds
@@ -69,7 +69,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/kup/kup4x/u-boot.lds b/board/kup/kup4x/u-boot.lds
index 18f962c..9fba835 100644
--- a/board/kup/kup4x/u-boot.lds
+++ b/board/kup/kup4x/u-boot.lds
@@ -69,7 +69,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/lwmon/u-boot.lds b/board/lwmon/u-boot.lds
index bc71b0d..49a8994 100644
--- a/board/lwmon/u-boot.lds
+++ b/board/lwmon/u-boot.lds
@@ -69,7 +69,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/manroland/uc100/u-boot.lds b/board/manroland/uc100/u-boot.lds
index e32ae37..2eaf612 100644
--- a/board/manroland/uc100/u-boot.lds
+++ b/board/manroland/uc100/u-boot.lds
@@ -72,7 +72,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/matrix_vision/mvsmr/u-boot.lds b/board/matrix_vision/mvsmr/u-boot.lds
index 5a3a9ea..9745e19 100644
--- a/board/matrix_vision/mvsmr/u-boot.lds
+++ b/board/matrix_vision/mvsmr/u-boot.lds
@@ -77,7 +77,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/mbx8xx/u-boot.lds b/board/mbx8xx/u-boot.lds
index 18f962c..9fba835 100644
--- a/board/mbx8xx/u-boot.lds
+++ b/board/mbx8xx/u-boot.lds
@@ -69,7 +69,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/mousse/u-boot.lds b/board/mousse/u-boot.lds
index 43f91f1..cdb56b4 100644
--- a/board/mousse/u-boot.lds
+++ b/board/mousse/u-boot.lds
@@ -63,7 +63,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/mvblue/u-boot.lds b/board/mvblue/u-boot.lds
index c378564..6161b21 100644
--- a/board/mvblue/u-boot.lds
+++ b/board/mvblue/u-boot.lds
@@ -73,7 +73,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/netphone/u-boot.lds b/board/netphone/u-boot.lds
index cdc1fda..bd4822e 100644
--- a/board/netphone/u-boot.lds
+++ b/board/netphone/u-boot.lds
@@ -69,7 +69,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/netta/u-boot.lds b/board/netta/u-boot.lds
index cdc1fda..bd4822e 100644
--- a/board/netta/u-boot.lds
+++ b/board/netta/u-boot.lds
@@ -69,7 +69,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/netta2/u-boot.lds b/board/netta2/u-boot.lds
index cdc1fda..bd4822e 100644
--- a/board/netta2/u-boot.lds
+++ b/board/netta2/u-boot.lds
@@ -69,7 +69,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/netvia/u-boot.lds b/board/netvia/u-boot.lds
index cdc1fda..bd4822e 100644
--- a/board/netvia/u-boot.lds
+++ b/board/netvia/u-boot.lds
@@ -69,7 +69,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/nx823/u-boot.lds b/board/nx823/u-boot.lds
index c8d3894..4d7ca31 100644
--- a/board/nx823/u-boot.lds
+++ b/board/nx823/u-boot.lds
@@ -69,7 +69,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/openrisc/openrisc-generic/u-boot.lds b/board/openrisc/openrisc-generic/u-boot.lds
index 4cffacb..10be54c 100644
--- a/board/openrisc/openrisc-generic/u-boot.lds
+++ b/board/openrisc/openrisc-generic/u-boot.lds
@@ -29,7 +29,7 @@  SECTIONS
 
 	 . = ALIGN(4);
 	 .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
 	 }
 
 	.rodata : {
diff --git a/board/quantum/u-boot.lds b/board/quantum/u-boot.lds
index 18f962c..9fba835 100644
--- a/board/quantum/u-boot.lds
+++ b/board/quantum/u-boot.lds
@@ -69,7 +69,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/r360mpi/u-boot.lds b/board/r360mpi/u-boot.lds
index 3ef0d9e..8eb2e11 100644
--- a/board/r360mpi/u-boot.lds
+++ b/board/r360mpi/u-boot.lds
@@ -71,7 +71,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/rbc823/u-boot.lds b/board/rbc823/u-boot.lds
index a86b568..06e34c6 100644
--- a/board/rbc823/u-boot.lds
+++ b/board/rbc823/u-boot.lds
@@ -80,7 +80,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
   . = .;
diff --git a/board/renesas/sh7757lcr/u-boot.lds b/board/renesas/sh7757lcr/u-boot.lds
index cf406ce..2c7bae8 100644
--- a/board/renesas/sh7757lcr/u-boot.lds
+++ b/board/renesas/sh7757lcr/u-boot.lds
@@ -79,7 +79,7 @@  SECTIONS
 
 
 	.u_boot_list : {
-		#include <u-boot.lst>
+		*(SORT(.u_boot_list*));
 	}
 
 	PROVIDE (reloc_dst_end = .);
diff --git a/board/rsdproto/u-boot.lds b/board/rsdproto/u-boot.lds
index ff95029..4cca0ad 100644
--- a/board/rsdproto/u-boot.lds
+++ b/board/rsdproto/u-boot.lds
@@ -100,7 +100,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/samsung/smdk5250/smdk5250-uboot-spl.lds b/board/samsung/smdk5250/smdk5250-uboot-spl.lds
index 951d8ce..07194bc 100644
--- a/board/samsung/smdk5250/smdk5250-uboot-spl.lds
+++ b/board/samsung/smdk5250/smdk5250-uboot-spl.lds
@@ -49,7 +49,7 @@  SECTIONS
 	. = ALIGN(4);
 
 	.u_boot_list : {
-		#include <u-boot.lst>
+		*(SORT(.u_boot_list*));
 	} >.sram
 	. = ALIGN(4);
 
diff --git a/board/samsung/smdk6400/u-boot-nand.lds b/board/samsung/smdk6400/u-boot-nand.lds
index fbb442a..7143b10 100644
--- a/board/samsung/smdk6400/u-boot-nand.lds
+++ b/board/samsung/smdk6400/u-boot-nand.lds
@@ -50,7 +50,7 @@  SECTIONS
 
 	. = align(4);
 	.u_boot_list : {
-		#include <u-boot.lst>
+		*(SORT(.u_boot_list*));
 	}
 
 	. = align(4);
diff --git a/board/sandpoint/u-boot.lds b/board/sandpoint/u-boot.lds
index ae3afa1..cfab80a 100644
--- a/board/sandpoint/u-boot.lds
+++ b/board/sandpoint/u-boot.lds
@@ -71,7 +71,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/sixnet/u-boot.lds b/board/sixnet/u-boot.lds
index 6cf7a01..d3b9c34 100644
--- a/board/sixnet/u-boot.lds
+++ b/board/sixnet/u-boot.lds
@@ -69,7 +69,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/snmc/qs850/u-boot.lds b/board/snmc/qs850/u-boot.lds
index f57f8a0..7b9d562 100644
--- a/board/snmc/qs850/u-boot.lds
+++ b/board/snmc/qs850/u-boot.lds
@@ -72,7 +72,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/snmc/qs860t/u-boot.lds b/board/snmc/qs860t/u-boot.lds
index 18f962c..9fba835 100644
--- a/board/snmc/qs860t/u-boot.lds
+++ b/board/snmc/qs860t/u-boot.lds
@@ -69,7 +69,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/spc1920/u-boot.lds b/board/spc1920/u-boot.lds
index 18f962c..9fba835 100644
--- a/board/spc1920/u-boot.lds
+++ b/board/spc1920/u-boot.lds
@@ -69,7 +69,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/spd8xx/u-boot.lds b/board/spd8xx/u-boot.lds
index f69e39d..7016bea 100644
--- a/board/spd8xx/u-boot.lds
+++ b/board/spd8xx/u-boot.lds
@@ -78,7 +78,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/stx/stxxtc/u-boot.lds b/board/stx/stxxtc/u-boot.lds
index cdc1fda..bd4822e 100644
--- a/board/stx/stxxtc/u-boot.lds
+++ b/board/stx/stxxtc/u-boot.lds
@@ -69,7 +69,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/svm_sc8xx/u-boot.lds b/board/svm_sc8xx/u-boot.lds
index 1635875..0024483 100644
--- a/board/svm_sc8xx/u-boot.lds
+++ b/board/svm_sc8xx/u-boot.lds
@@ -86,7 +86,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/tqc/tqm8xx/u-boot.lds b/board/tqc/tqm8xx/u-boot.lds
index e1e1ccd..530a999 100644
--- a/board/tqc/tqm8xx/u-boot.lds
+++ b/board/tqc/tqm8xx/u-boot.lds
@@ -82,7 +82,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/v37/u-boot.lds b/board/v37/u-boot.lds
index fd2d72e..191e58d 100644
--- a/board/v37/u-boot.lds
+++ b/board/v37/u-boot.lds
@@ -69,7 +69,7 @@  SECTIONS
 
   . = ALIGN(4);
   .u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
   }
 
 
diff --git a/board/vpac270/u-boot-spl.lds b/board/vpac270/u-boot-spl.lds
index 20161a4..57589cd 100644
--- a/board/vpac270/u-boot-spl.lds
+++ b/board/vpac270/u-boot-spl.lds
@@ -58,7 +58,7 @@  SECTIONS
 	}
 
 	.u_boot_list : {
-		#include <u-boot.lst>
+		*(SORT(.u_boot_list*));
 	}
 
 	. = ALIGN(4);
diff --git a/common/cmd_help.c b/common/cmd_help.c
index f832a96..d9bdc4d 100644
--- a/common/cmd_help.c
+++ b/common/cmd_help.c
@@ -41,7 +41,7 @@  U_BOOT_CMD(
 );
 
 /* This does not use the U_BOOT_CMD macro as ? can't be used in symbol names */
-ll_entry_declare(cmd_tbl_t, question_mark, cmd, cmd) = {
+ll_entry_declare(cmd_tbl_t, question_mark, cmd) = {
 	"?",	CONFIG_SYS_MAXARGS,	1,	do_help,
 	"alias for 'help'",
 #ifdef  CONFIG_SYS_LONGHELP
diff --git a/common/command.c b/common/command.c
index 50c8429..6ac59e4 100644
--- a/common/command.c
+++ b/common/command.c
@@ -507,6 +507,7 @@  static int cmd_call(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 	int result;
 
 	result = (cmdtp->cmd)(cmdtp, flag, argc, argv);
+
 	if (result)
 		debug("Command failed, result=%d", result);
 	return result;
diff --git a/config.mk b/config.mk
index b7cd481..bb5c69a 100644
--- a/config.mk
+++ b/config.mk
@@ -23,8 +23,6 @@ 
 
 #########################################################################
 
-include $(TOPDIR)/helper.mk
-
 ifeq ($(CURDIR),$(SRCTREE))
 dir :=
 else
diff --git a/helper.mk b/helper.mk
deleted file mode 100644
index 79a1da0..0000000
--- a/helper.mk
+++ /dev/null
@@ -1,64 +0,0 @@ 
-#
-# Copyright (C) 2012 Marek Vasut <marex@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.
-#
-#########################################################################
-
-##
-# make_u_boot_list - Generate contents of u_boot_list section
-# 1:		The name of the resulting file (usually u-boot.lst)
-# 2:		Files to analyze for possible u_boot_list entries
-#
-# This function generates the contents of the u_boot_list section,
-# including all the border symbols for it's subsections. The operation
-# of this function is as follows, numbering goes per lines:
-#
-# 1) Dump the ELF header sections from all files supplied via $(2)
-# 2) Filter out all other stuff that does not belong into .u_boot_list
-#    section.
-# 3) Fix up the lines so that the resulting output is is in format
-#    ".u_boot_list.*".
-# 4) Remove the last .something$, since that only contains the name
-#    of the variable to be put into a subsection. This name is irelevant
-#    for generation of border symbols, thus of no interest, remove it.
-# 5) Take each line and for every dot "." in that line, print the whole
-#    line until that dot "." . This is important so that we have all
-#    parent border symbols generated as well.
-# 6) Load every line and firstly append "\a" at the end and print the
-#    line. Next, append "@" at the end and print the line. Finally,
-#    append "~" at the end of line. This will make sense in conjunction
-#    with 6) and 7).
-# 7) Sort the lines. It is imperative to use LC_COLLATE=C here because
-#    with this, the "\a" symbol is first and "~" symbol is last. Any
-#    other symbols fall inbetween. Symbols like "@", which marks the
-#    end of current line (representing current section) and ".", which
-#    means the line continues and thus represents subsection.
-# 8) With such ordering, all lines ending with "\a" will float at the
-#    begining of all lines with the same prefix. Thus it is easy to
-#    replace "\a" with __start and make it the __start border symbol.
-#    Very similarly for "~", which will be always at the bottom and so
-#    can be replaced by "__end" and made into the __end border symbol.
-#    Finally, every line ending with "@" symbol will be transformed
-#    into " *(SORT(${line}*)); " format, which in the linker parlance
-#    will allow it to trap all symbols relevant to the subsection.
-#
-define make_u_boot_list
-$(1): $(2)
-	$(OBJDUMP) -h $(2) | \
-	sed -n -e '/.*\.u_boot_list[^ ]\+/ ! {d;n}' \
-		-e 's/.*\(\.u_boot_list[^ ]\+\).*$$$$/\1/' \
-		-e 's/\.[^\.]\+$$$$//' \
-		-e ':s /^.\+$$$$/ { p;s/^\(.*\)\.[^\.]*$$$$/\1/;b s }' | \
-	sed -n -e 'h;s/$$$$/\a/p;g;s/$$$$/@/p;g;s/$$$$/~/p;' | \
-	LC_COLLATE=C sort -u | \
-	sed -n -e '/\a$$$$/ { s/\./_/g;s/\a$$$$/__start = .;/p; }'\
-		-e '/~$$$$/ { s/\./_/g;s/~$$$$/__end = .;/p; }'\
-		-e '/@$$$$/ { s/\(.*\)@$$$$/*(SORT(\1.*));/p }' > $(1)
-endef
diff --git a/include/command.h b/include/command.h
index 476e7cf..d412c87 100644
--- a/include/command.h
+++ b/include/command.h
@@ -173,7 +173,7 @@  int cmd_process(int flag, int argc, char * const argv[],
 					_usage, _help, NULL)
 
 #define U_BOOT_CMD_COMPLETE(_name, _maxargs, _rep, _cmd, _usage, _help, _comp) \
-	ll_entry_declare(cmd_tbl_t, _name, cmd, cmd) =			\
+	ll_entry_declare(cmd_tbl_t, _name, cmd) =			\
 		U_BOOT_CMD_MKENT_COMPLETE(_name, _maxargs, _rep, _cmd,	\
 						_usage, _help, _comp);
 
diff --git a/include/env_callback.h b/include/env_callback.h
index c583120..afdee28 100644
--- a/include/env_callback.h
+++ b/include/env_callback.h
@@ -76,7 +76,7 @@  void env_callback_init(ENTRY *var_entry);
 	}
 #else
 #define U_BOOT_ENV_CALLBACK(name, callback) \
-	ll_entry_declare(struct env_clbk_tbl, name, env_clbk, env_clbk) = \
+	ll_entry_declare(struct env_clbk_tbl, name, env_clbk) = \
 	{#name, callback}
 #endif
 
diff --git a/include/linker_lists.h b/include/linker_lists.h
index 0b405d7..b88ac82 100644
--- a/include/linker_lists.h
+++ b/include/linker_lists.h
@@ -13,6 +13,95 @@ 
  * published by the Free Software Foundation; either version 2 of
  * the License, or (at your option) any later version.
  */
+
+/**
+ * There is no use in including this from ASM files, but that happens
+ * anyway, e.g. PPC kgdb.S includes command.h which incluse us.
+ * So just don't define anything when included from ASM.
+ */
+
+#if !defined(__ASSEMBLY__)
+
+/**
+ * Linker lists are constructed by grouping together linker input
+ * sections, each containning one entry of the list. Each input section
+ * contains a constant initialized variable which holds the entry's
+ * content. Linker list input sections are constructed from the list
+ * and entry names, plus a prefix which allows grouping all lists
+ * together. Assuming _list and _entry are the list and entry names,
+ * then the corresponding input section name is
+ *
+ *   _u_boot_list + _2_ + @_list + _2_ + @_entry
+ *
+ * and the C variable name is
+ *
+ *   .u_boot_list_ + 2_ + @_list + _2_ + @_entry
+ *
+ * This ensures uniqueness for both input section and C variable name.
+ *
+ * Note that the names differ only in the prefix character, "." for the
+ * setion and "_" for the variable, so that the linker cannot confuse
+ * section and symbol names. From now on, both names will be referred
+ * to as
+ *
+ *   %u_boot_list_ + 2_ + @_list + _2_ + @_entry
+ *
+ * Entry variables need never be referred to directly.
+ *
+ * The naming scheme for input sections allows grouping all linker lists
+ * into a single linker output section and grouping all entries for a
+ * single list.
+ *
+ * Note the two '_2_' constant components in the names: they are needed
+ * to be able to put start and end symbols around a list, by mapping
+ * them to sections names with components "1" (before) and "3" (after).
+ * Start and end symbols for a list can generally be defined as
+ *
+ *   %u_boot_list_2_ + @_list + _1_...
+ *   %u_boot_list_2_ + @_list + _3_...
+ *
+ * Start and end symbols for the whole of the linker lists area can be
+ * defined as
+ *
+ *   %u_boot_list_1_...
+ *   %u_boot_list_3_...
+ *
+ * Here is an example of the sorted sections which result from a list
+ * "array" made up of three entries : "first", "second" and "third",
+ * iterated at least once.
+ *
+ *   .u_boot_list_2_array_1
+ *   .u_boot_list_2_array_2_first
+ *   .u_boot_list_2_array_2_second
+ *   .u_boot_list_2_array_2_third
+ *   .u_boot_list_2_array_3
+ *
+ * If lists must be divided into sublists (e.g. for iterating only on
+ * part of a list), one can simply use the list a name of the form
+ * 'outer_2_inner', where 'outer' is the global list name and 'inner'
+ * is the sub-list name. Iterators for the whole list should use the
+ * global list name ("outer"); iterators for only a sub-list should use
+ * the full sub-list name ("outer_2_inner").
+ *
+ *  Here is an example of the sections generated from a global list
+ * named "drivers", two sub-lists named "i2c" and "pci", and iterators
+ * defined for the whole list and each sub-list:
+ *
+ *   %u_boot_list_2_drivers_1
+ *   %u_boot_list_2_drivers_2_i2c_1
+ *   %u_boot_list_2_drivers_2_i2c_2_first
+ *   %u_boot_list_2_drivers_2_i2c_2_first
+ *   %u_boot_list_2_drivers_2_i2c_2_second
+ *   %u_boot_list_2_drivers_2_i2c_2_third
+ *   %u_boot_list_2_drivers_2_i2c_3
+ *   %u_boot_list_2_drivers_2_pci_1
+ *   %u_boot_list_2_drivers_2_pci_2_first
+ *   %u_boot_list_2_drivers_2_pci_2_second
+ *   %u_boot_list_2_drivers_2_pci_2_third
+ *   %u_boot_list_2_drivers_2_pci_3
+ *   %u_boot_list_2_drivers_3
+ */
+
 #ifndef __LINKER_LISTS_H__
 #define __LINKER_LISTS_H__
 
@@ -20,43 +109,28 @@ 
  * ll_entry_declare() - Declare linker-generated array entry
  * @_type:	Data type of the entry
  * @_name:	Name of the entry
- * @_section_u:	Subsection of u_boot_list in which this entry is placed
- *		(with underscores instead of dots, for name concatenation)
- * @_section_d:	Subsection of u_boot_list in which this entry is placed
- *		(with dots, for section concatenation)
+ * @_list:	name of the list. Should contain only characters allowed
+ *		in a C variable name!
  *
  * This macro declares a variable that is placed into a linker-generated
  * array. This is a basic building block for more advanced use of linker-
  * generated arrays. The user is expected to build their own macro wrapper
  * around this one.
  *
- * A variable declared using this macro must be compile-time initialized
- * and is as such placed into subsection of special section, .u_boot_list.
- * The subsection is specified by the _section_[u,d] parameter, see below.
- * The base name of the variable is _name, yet the actual variable is
- * declared as concatenation of
- *
- *   %_u_boot_list_ + @_section_u + _ + @_name
- *
- * which ensures name uniqueness. This variable shall never be refered
- * directly though.
+ * A variable declared using this macro must be compile-time initialized.
  *
  * Special precaution must be made when using this macro:
- * 1) The _type must not contain the "static" keyword, otherwise the entry
- *    is not generated.
  *
- * 2) The @_section_u and @_section_d variables must match, the only difference
- *    is that in @_section_u is every dot "." character present in @_section_d
- *    replaced by a single underscore "_" character in @_section_u. The actual
- *    purpose of these parameters is to select proper subsection in the global
- *    .u_boot_list section.
+ * 1) The _type must not contain the "static" keyword, otherwise the
+ *    entry is generated and can be iterated but is listed in the map
+ *    file and cannot be retrieved by name.
  *
- * 3) In case a section is declared that contains some array elements AND a
+ * 2) In case a section is declared that contains some array elements AND a
  *    subsection of this section is declared and contains some elements, it is
  *    imperative that the elements are of the same type.
  *
  * 4) In case an outer section is declared that contains some array elements
- *    AND am inner subsection of this section is declared and contains some
+ *    AND an inner subsection of this section is declared and contains some
  *    elements, then when traversing the outer section, even the elements of
  *    the inner sections are present in the array.
  *
@@ -66,39 +140,68 @@ 
  *         .y = 4,
  * };
  */
-#define ll_entry_declare(_type, _name, _section_u, _section_d)		\
-	_type _u_boot_list_##_section_u##_##_name __attribute__((	\
-			unused,	aligned(4),				\
-			section(".u_boot_list."#_section_d"."#_name)))
+#define ll_entry_declare(_type, _name, _list)				\
+	_type _u_boot_list_2_##_list##_2_##_name __aligned(4)		\
+			__attribute__((unused,				\
+			section(".u_boot_list_2_"#_list"_2_"#_name)))
+
+/**
+ * We need a zero-size type for iterator symbols, and the compiler does
+ * not allow defining objects of C type 'void'. Therefore we go for the
+ * next best thing: an empty struct.
+ */
 
 /**
  * ll_entry_start() - Point to first entry of linker-generated array
  * @_type:	Data type of the entry
- * @_section_u:	Subsection of u_boot_list in which this entry is placed
- *		(with underscores instead of dots)
+ * @_list:	Name of the list in which this entry is placed
  *
  * This function returns (_type *) pointer to the very first entry of a
  * linker-generated array placed into subsection of .u_boot_list section
- * specified by _section_u argument.
+ * specified by _list argument.
+ *
+ * Since this macro defines an array start symbol, its leftmost index
+ * must be 2 and its rightmost index must be 1.
  *
  * Example:
  * struct my_sub_cmd *msc = ll_entry_start(struct my_sub_cmd, cmd_sub);
  */
-#define ll_entry_start(_type, _section_u)				\
-	({								\
-		extern _type _u_boot_list_##_section_u##__start;	\
-		_type *_ll_result = &_u_boot_list_##_section_u##__start;\
-		_ll_result;						\
-	})
+#define ll_entry_start(_type, _list)				\
+({									\
+	static struct {} start __aligned(4) __attribute__((unused,	\
+		section(".u_boot_list_2_"#_list"_1")));			\
+	(_type *)&start;						\
+})
 
 /**
- * ll_entry_count() - Return the number of elements in linker-generated array
+ * ll_entry_end() - Point after last entry of linker-generated array
  * @_type:	Data type of the entry
- * @_section_u:	Subsection of u_boot_list in which this entry is placed
+ * @_list:	Name of the list in which this entry is placed
  *		(with underscores instead of dots)
  *
+ * This function returns (_type *) pointer after the very last entry of
+ * a linker-generated array placed into subsection of .u_boot_list
+ * section specified by _list argument.
+ *
+ * Since this macro defines an array end symbol, its leftmost index
+ * must be 2 and its rightmost index must be 3.
+ *
+ * Example:
+ * struct my_sub_cmd *msc = ll_entry_end(struct my_sub_cmd, cmd_sub);
+ */
+#define ll_entry_end(_type, _list)					\
+({									\
+	static struct {} end __aligned(4) __attribute__((unused,	\
+		section(".u_boot_list_2_"#_list"_3")));			\
+	(_type *)&end;							\
+})
+/**
+ * ll_entry_count() - Return the number of elements in linker-generated array
+ * @_type:	Data type of the entry
+ * @_list:	Name of the list of which the number of elements is computed
+ *
  * This function returns the number of elements of a linker-generated array
- * placed into subsection of .u_boot_list section specified by _section_u
+ * placed into subsection of .u_boot_list section specified by _list
  * argument. The result is of an unsigned int type.
  *
  * Example:
@@ -108,23 +211,19 @@ 
  * for (i = 0; i < count; i++, msc++)
  *         printf("Entry %i, x=%i y=%i\n", i, msc->x, msc->y);
  */
-#define ll_entry_count(_type, _section_u)				\
+#define ll_entry_count(_type, _list)					\
 	({								\
-		extern _type _u_boot_list_##_section_u##__start;	\
-		extern _type _u_boot_list_##_section_u##__end;		\
-		unsigned int _ll_result =				\
-			&_u_boot_list_##_section_u##__end -		\
-			&_u_boot_list_##_section_u##__start;		\
+		_type *start = ll_entry_start(_type, _list);		\
+		_type *end = ll_entry_end(_type, _list);		\
+		unsigned int _ll_result = end - start;			\
 		_ll_result;						\
 	})
 
-
 /**
  * ll_entry_get() - Retrieve entry from linker-generated array by name
  * @_type:	Data type of the entry
  * @_name:	Name of the entry
- * @_section_u:	Subsection of u_boot_list in which this entry is placed
- *		(with underscores instead of dots)
+ * @_list:	Name of the list in which this entry is placed
  *
  * This function returns a pointer to a particular entry in LG-array
  * identified by the subsection of u_boot_list where the entry resides
@@ -138,11 +237,54 @@ 
  * ...
  * struct my_sub_cmd *c = ll_entry_get(struct my_sub_cmd, my_sub_cmd, cmd_sub);
  */
-#define ll_entry_get(_type, _name, _section_u)				\
+#define ll_entry_get(_type, _name, _list)				\
 	({								\
-		extern _type _u_boot_list_##_section_u##_##_name;	\
-		_type *_ll_result = &_u_boot_list_##_section_u##_##_name;\
+		extern _type _u_boot_list_2_##_list##_2_##_name;	\
+		_type *_ll_result =					\
+			&_u_boot_list_2_##_list##_2_##_name;	\
 		_ll_result;						\
 	})
 
+/**
+ * ll_start() - Point to first entry of first linker-generated array
+ * @_type:	Data type of the entry
+ *
+ * This function returns (_type *) pointer to the very first entry of
+ * the very first linker-generated array.
+ *
+ * Since this macro defines the start of the linker-generated arrays,
+ * its leftmost index must be 1.
+ *
+ * Example:
+ * struct my_sub_cmd *msc = ll_start(struct my_sub_cmd);
+ */
+#define ll_start(_type)							\
+({									\
+	static struct {} start __aligned(4) __attribute__((unused,	\
+		section(".u_boot_list_1")));				\
+	(_type *)&start;						\
+})
+
+/**
+ * ll_entry_end() - Point after last entry of last linker-generated array
+ * @_type:	Data type of the entry
+ *
+ * This function returns (_type *) pointer after the very last entry of
+ * the very last linker-generated array.
+ *
+ * Since this macro defines the end of the linker-generated arrays,
+ * its leftmost index must be 3.
+ *
+ * Example:
+ * struct my_sub_cmd *msc = ll_end(struct my_sub_cmd);
+ */
+#define ll_end(_type)							\
+({									\
+	static struct {} end __aligned(4) __attribute__((unused,	\
+		section(".u_boot_list_3")));				\
+	(_type *)&end;							\
+})
+
+#endif /* __ASSEMBLY__ */
+
 #endif	/* __LINKER_LISTS_H__ */
diff --git a/nand_spl/board/freescale/mpc8536ds/Makefile b/nand_spl/board/freescale/mpc8536ds/Makefile
index 9c77826..d5a71c3 100644
--- a/nand_spl/board/freescale/mpc8536ds/Makefile
+++ b/nand_spl/board/freescale/mpc8536ds/Makefile
@@ -62,11 +62,7 @@  $(nandobj)u-boot-spl:	$(OBJS) $(nandobj)u-boot-nand_spl.lds
 		-Map $(nandobj)u-boot-spl.map \
 		-o $(nandobj)u-boot-spl
 
-# The following line expands into whole rule which generates $(LSTSCRIPT),
-# the file containing u-boots LG-array linker section. This is included into
-# $(LDSCRIPT). The function make_u_boot_list is defined in helper.mk file.
-$(eval $(call make_u_boot_list, $(LSTSCRIPT), $(OBJS)))
-$(nandobj)u-boot-nand_spl.lds: $(LDSCRIPT) $(LSTSCRIPT)
+$(nandobj)u-boot-nand_spl.lds: $(LDSCRIPT)
 	$(CPP) $(CPPFLAGS) $(LDPPFLAGS) -I$(nandobj)/board/$(BOARDDIR) \
 		-ansi -D__ASSEMBLY__ -P - <$< >$@
 
diff --git a/nand_spl/board/freescale/mpc8569mds/Makefile b/nand_spl/board/freescale/mpc8569mds/Makefile
index 9c77826..d5a71c3 100644
--- a/nand_spl/board/freescale/mpc8569mds/Makefile
+++ b/nand_spl/board/freescale/mpc8569mds/Makefile
@@ -62,11 +62,7 @@  $(nandobj)u-boot-spl:	$(OBJS) $(nandobj)u-boot-nand_spl.lds
 		-Map $(nandobj)u-boot-spl.map \
 		-o $(nandobj)u-boot-spl
 
-# The following line expands into whole rule which generates $(LSTSCRIPT),
-# the file containing u-boots LG-array linker section. This is included into
-# $(LDSCRIPT). The function make_u_boot_list is defined in helper.mk file.
-$(eval $(call make_u_boot_list, $(LSTSCRIPT), $(OBJS)))
-$(nandobj)u-boot-nand_spl.lds: $(LDSCRIPT) $(LSTSCRIPT)
+$(nandobj)u-boot-nand_spl.lds: $(LDSCRIPT)
 	$(CPP) $(CPPFLAGS) $(LDPPFLAGS) -I$(nandobj)/board/$(BOARDDIR) \
 		-ansi -D__ASSEMBLY__ -P - <$< >$@
 
diff --git a/nand_spl/board/freescale/mpc8572ds/Makefile b/nand_spl/board/freescale/mpc8572ds/Makefile
index 9c77826..d5a71c3 100644
--- a/nand_spl/board/freescale/mpc8572ds/Makefile
+++ b/nand_spl/board/freescale/mpc8572ds/Makefile
@@ -62,11 +62,7 @@  $(nandobj)u-boot-spl:	$(OBJS) $(nandobj)u-boot-nand_spl.lds
 		-Map $(nandobj)u-boot-spl.map \
 		-o $(nandobj)u-boot-spl
 
-# The following line expands into whole rule which generates $(LSTSCRIPT),
-# the file containing u-boots LG-array linker section. This is included into
-# $(LDSCRIPT). The function make_u_boot_list is defined in helper.mk file.
-$(eval $(call make_u_boot_list, $(LSTSCRIPT), $(OBJS)))
-$(nandobj)u-boot-nand_spl.lds: $(LDSCRIPT) $(LSTSCRIPT)
+$(nandobj)u-boot-nand_spl.lds: $(LDSCRIPT)
 	$(CPP) $(CPPFLAGS) $(LDPPFLAGS) -I$(nandobj)/board/$(BOARDDIR) \
 		-ansi -D__ASSEMBLY__ -P - <$< >$@
 
diff --git a/nand_spl/board/freescale/mx31pdk/Makefile b/nand_spl/board/freescale/mx31pdk/Makefile
index fd0dfc1..59c46b6 100644
--- a/nand_spl/board/freescale/mx31pdk/Makefile
+++ b/nand_spl/board/freescale/mx31pdk/Makefile
@@ -38,11 +38,7 @@  $(nandobj)u-boot-spl:	$(OBJS) $(nandobj)u-boot.lds
 		-Map $(nandobj)u-boot-spl.map \
 		-o $@
 
-# The following line expands into whole rule which generates $(LSTSCRIPT),
-# the file containing u-boots LG-array linker section. This is included into
-# $(LDSCRIPT). The function make_u_boot_list is defined in helper.mk file.
-$(eval $(call make_u_boot_list, $(LSTSCRIPT), $(OBJS)))
-$(nandobj)u-boot.lds: $(LDSCRIPT) $(LSTSCRIPT)
+$(nandobj)u-boot.lds: $(LDSCRIPT)
 	$(CPP) $(CPPFLAGS) $(LDPPFLAGS) -I$(nandobj)/board/$(BOARDDIR) \
 		-ansi -D__ASSEMBLY__ -P - <$< >$@
 
diff --git a/nand_spl/board/freescale/mx31pdk/u-boot.lds b/nand_spl/board/freescale/mx31pdk/u-boot.lds
index a26110f..0656176 100644
--- a/nand_spl/board/freescale/mx31pdk/u-boot.lds
+++ b/nand_spl/board/freescale/mx31pdk/u-boot.lds
@@ -49,7 +49,7 @@  SECTIONS
 
 	. = ALIGN(4);
 	.u_boot_list : {
-		#include <u-boot.lst>
+		*(SORT(.u_boot_list*));
 	}
 
 	. = ALIGN(4);
diff --git a/nand_spl/board/freescale/p1010rdb/Makefile b/nand_spl/board/freescale/p1010rdb/Makefile
index c3495ec..ca9be7c 100644
--- a/nand_spl/board/freescale/p1010rdb/Makefile
+++ b/nand_spl/board/freescale/p1010rdb/Makefile
@@ -62,11 +62,7 @@  $(nandobj)u-boot-spl:	$(OBJS) $(nandobj)u-boot-nand_spl.lds
 		-Map $(nandobj)u-boot-spl.map \
 		-o $(nandobj)u-boot-spl
 
-# The following line expands into whole rule which generates $(LSTSCRIPT),
-# the file containing u-boots LG-array linker section. This is included into
-# $(LDSCRIPT). The function make_u_boot_list is defined in helper.mk file.
-$(eval $(call make_u_boot_list, $(LSTSCRIPT), $(OBJS)))
-$(nandobj)u-boot-nand_spl.lds: $(LDSCRIPT) $(LSTSCRIPT)
+$(nandobj)u-boot-nand_spl.lds: $(LDSCRIPT)
 	$(CPP) $(CPPFLAGS) $(LDPPFLAGS) -I$(nandobj)board/$(BOARDDIR) \
 		 -ansi -D__ASSEMBLY__ -P - <$< >$@
 
diff --git a/nand_spl/board/freescale/p1023rds/Makefile b/nand_spl/board/freescale/p1023rds/Makefile
index 9b2c0d7..a873c76 100644
--- a/nand_spl/board/freescale/p1023rds/Makefile
+++ b/nand_spl/board/freescale/p1023rds/Makefile
@@ -57,11 +57,7 @@  $(nandobj)u-boot-spl:	$(OBJS) $(nandobj)u-boot-nand_spl.lds
 		-Map $(nandobj)u-boot-spl.map \
 		-o $(nandobj)u-boot-spl
 
-# The following line expands into whole rule which generates $(LSTSCRIPT),
-# the file containing u-boots LG-array linker section. This is included into
-# $(LDSCRIPT). The function make_u_boot_list is defined in helper.mk file.
-$(eval $(call make_u_boot_list, $(LSTSCRIPT), $(OBJS)))
-$(nandobj)u-boot-nand_spl.lds: $(LDSCRIPT) $(LSTSCRIPT)
+$(nandobj)u-boot-nand_spl.lds: $(LDSCRIPT)
 	$(CPP) $(CPPFLAGS) $(LDPPFLAGS) -I$(nandobj)/board/$(BOARDDIR) \
 		-ansi -D__ASSEMBLY__ -P - <$< >$@
 
diff --git a/nand_spl/board/freescale/p1_p2_rdb/Makefile b/nand_spl/board/freescale/p1_p2_rdb/Makefile
index 9c77826..d5a71c3 100644
--- a/nand_spl/board/freescale/p1_p2_rdb/Makefile
+++ b/nand_spl/board/freescale/p1_p2_rdb/Makefile
@@ -62,11 +62,7 @@  $(nandobj)u-boot-spl:	$(OBJS) $(nandobj)u-boot-nand_spl.lds
 		-Map $(nandobj)u-boot-spl.map \
 		-o $(nandobj)u-boot-spl
 
-# The following line expands into whole rule which generates $(LSTSCRIPT),
-# the file containing u-boots LG-array linker section. This is included into
-# $(LDSCRIPT). The function make_u_boot_list is defined in helper.mk file.
-$(eval $(call make_u_boot_list, $(LSTSCRIPT), $(OBJS)))
-$(nandobj)u-boot-nand_spl.lds: $(LDSCRIPT) $(LSTSCRIPT)
+$(nandobj)u-boot-nand_spl.lds: $(LDSCRIPT)
 	$(CPP) $(CPPFLAGS) $(LDPPFLAGS) -I$(nandobj)/board/$(BOARDDIR) \
 		-ansi -D__ASSEMBLY__ -P - <$< >$@
 
diff --git a/nand_spl/board/karo/tx25/Makefile b/nand_spl/board/karo/tx25/Makefile
index 82489d2..7b1e62e 100644
--- a/nand_spl/board/karo/tx25/Makefile
+++ b/nand_spl/board/karo/tx25/Makefile
@@ -59,11 +59,7 @@  $(nandobj)u-boot-spl:	$(OBJS) $(nandobj)u-boot.lds
 		-Map $(nandobj)u-boot-spl.map \
 		-o $@
 
-# The following line expands into whole rule which generates $(LSTSCRIPT),
-# the file containing u-boots LG-array linker section. This is included into
-# $(LDSCRIPT). The function make_u_boot_list is defined in helper.mk file.
-$(eval $(call make_u_boot_list, $(LSTSCRIPT), $(OBJS)))
-$(nandobj)u-boot.lds: $(LDSCRIPT) $(LSTSCRIPT)
+$(nandobj)u-boot.lds: $(LDSCRIPT)
 	$(CPP) $(CPPFLAGS) $(LDPPFLAGS) -I$(nandobj)/board/$(BOARDDIR) \
 		-ansi -D__ASSEMBLY__ -P - <$< >$@
 
diff --git a/nand_spl/board/karo/tx25/u-boot.lds b/nand_spl/board/karo/tx25/u-boot.lds
index ee36131..ea84d64 100644
--- a/nand_spl/board/karo/tx25/u-boot.lds
+++ b/nand_spl/board/karo/tx25/u-boot.lds
@@ -49,7 +49,7 @@  SECTIONS
 
 	. = ALIGN(4);
 	.u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
 	}
 
 	. = ALIGN(4);
diff --git a/nand_spl/board/samsung/smdk6400/u-boot.lds b/nand_spl/board/samsung/smdk6400/u-boot.lds
index 2ed6466..66b412e 100644
--- a/nand_spl/board/samsung/smdk6400/u-boot.lds
+++ b/nand_spl/board/samsung/smdk6400/u-boot.lds
@@ -53,7 +53,7 @@  SECTIONS
 
 	. = ALIGN(4);
 	.u_boot_list : {
-	#include <u-boot.lst>
+	*(SORT(.u_boot_list*));
 	}
 
 	. = ALIGN(4);
diff --git a/spl/Makefile b/spl/Makefile
index 6dbb105..d496811 100644
--- a/spl/Makefile
+++ b/spl/Makefile
@@ -178,11 +178,7 @@  $(START):	depend
 $(LIBS):	depend
 	$(MAKE) -C $(SRCTREE)$(dir $(subst $(SPLTREE),,$@))
 
-# The following line expands into whole rule which generates u-boot.lst,
-# the file containing u-boots LG-array linker section. This is included into
-# $(LDSCRIPT). The function make_u_boot_list is defined in helper.mk file.
-$(eval $(call make_u_boot_list, $(obj)u-boot.lst, $(LIBS)))
-$(obj)u-boot-spl.lds: $(LDSCRIPT) $(obj)u-boot.lst depend
+$(obj)u-boot-spl.lds: $(LDSCRIPT) depend
 	$(CPP) $(CPPFLAGS) $(LDPPFLAGS) -I$(obj). -ansi -D__ASSEMBLY__ -P - < $< > $@
 
 depend:	$(obj).depend