[HOW] binutils-2.17 breaks the 2.6.26 kernel
Milton Miller
miltonm at bga.com
Thu Jul 17 02:21:17 EST 2008
Hi.
I've been working with Debian bintuils 2.17-3 (which identifies
itself as 2.17) on my build box for some time.
When testing all-yes-config, I was getting warnings, but the
vmlinux was booting via kexec.
Since I was replicating the warnings from BFD about section lmas
overlapping in vmlinux.strip.$$, I was encouraged to actually try
booting the resulting stripped kernel. After a false start (getting
the old binary) I ended up replicating the fail-to-boot some people
have reported on linuxppc-dev.
Digging into the failure, we were trying to copy *way* too much data
in copy_and_flush from after_prom. I found the value loaded from
_klimit was something like 0x00002fea_00400000, not quite _end that
it was initialized.
I tracked this down to the .rodata and all sections following loosing
the inter-section alignment.
/DISCARD/ {
....
}
text: AT( .text - LOAD_OFFSET): {
....
}
. = ALIGN(0x1000) /* this align directive aparently gets lost
when stripping the file */
.rodata: AT (.rodata - LOAD_OFFSET): {
...
}
the effects of that align were dropped during strip, shifting all
following sections up in memory and the resulting failure.
I don't know if the fault is ld or strip.
The behavior came between 2.6.24 and -next-20080710, but others
have suggested their kernels don't boot in the 2.6.25 to 2.6.26
transition, and a likely candidate is the addition of AT(x) to
set the lma, although we also switched form TEXT_TEXT macro in
include/asm-generic.h to a hand-rolled .text section.
Can we come up with a workaround?
thanks,
milton
More information about the Linuxppc-dev
mailing list