Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 13 Oct 2008 20:26:38 +0100
From:      Bruce M Simpson <bms@incunabulum.net>
To:        "M. Warner Losh" <imp@bsdimp.com>
Cc:        freebsd-embedded@FreeBSD.org
Subject:   Re: ELF loader problem with CFE on ASUS WL500g
Message-ID:  <48F3A0EE.7040003@incunabulum.net>
In-Reply-To: <20081013.125648.1239212699.imp@bsdimp.com>
References:  <48F39798.3010606@incunabulum.net> <20081013.125648.1239212699.imp@bsdimp.com>

next in thread | previous in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------000707010509060807020608
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

M. Warner Losh wrote:
> I thought you could fix this with linker script tweaks...
>   

Not in an automated way. It'll let you set a *fixed* LMA by adding 
AT(...) to the PHDR linker script section, but that's not very useful. 
Trying to use a non-constant expression produces an error; and 
LOADADDR() wants a *section*, not a *segment*.

The first thing I tried was to use the "load -addr" option in CFE; it 
totally ignores this option as it only applies to raw images.

I tried the GNU ld MEMORY { ... } section, but it changes the VMA as 
well as the LMA.

I seem to remember I had headaches like this when trying to build 
FreeBSD with the MinGW toolchain to boot on an SGI Visual Workstation.
> bummer...  It sounds a bit like we need to do the normal tricks of
> 'early' boot loaders: turn on the mmu and then jump to . to transition
> from PA to VA addresses...
>
> : It looks like objcopy's --change-section-lma option, with a negative 
> : offset, would do what I want, however it will need to be scripted to 
> : work on named sections.
>
> You might try to mock-up a test with a newer version of binutils than
> 2.15 we're using?
>   

I tried the attached script, which produces a BFD error:
    BFD: kernel.rebased: section `.hash' can't be allocated in segment 3

One common problem with these Broadcom based platforms is that they 
almost always ship with CFE, and it's convenient to use the inbuilt ELF 
loader for bootstrapping.

Unfortunately CFE comes with bugs attached, and there are usually no 
alternative boot loaders available due to Broadcom's less than, shall we 
say, "open" attitude towards open source. *ahem*

So yeah, it sounds like we probably need something like the ARM ELF 
trampoline for MIPS ideally.

It would probably also be relatively easy to write a small C tool with 
libelf to do the rebasing CFE expects.

I have a train to catch in a few hours, I'd better not get in too deep...

later
BMS


--------------000707010509060807020608
Content-Type: text/plain;
 name="fnord.sh"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="fnord.sh"

#!/bin/sh

OBJCOPY=mips-rtems-objcopy
KERNEL=kernel
REBASE=0x80000000

SECTIONS=$(mips-rtems-objdump -h $KERNEL | grep ' \.' | awk '{ if (substr($4,0,2) == "80") print $2}')

OCOPTS=""
for i in $SECTIONS ; do
  OCOPTS="$OCOPTS --change-section-lma ${i}-${REBASE}"
done

set -x
exec $OBJCOPY $OCOPTS $KERNEL ${KERNEL}.rebased

--------------000707010509060807020608--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?48F3A0EE.7040003>