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