ELF loader problem with CFE on ASUS WL500g

Bruce M Simpson bms at incunabulum.net
Mon Oct 13 19:26:41 UTC 2008


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

-------------- next part --------------
#!/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


More information about the freebsd-embedded mailing list