"relocation truncated"
edmundo at rano.demon.co.uk
edmundo at rano.demon.co.uk
Sun Mar 14 17:46:30 CET 1999
As usually happens, I have some ideas of my own straight after
posting. Without actually understanding any of this, I have done some
experiments (randomly commenting out bits of assembler and seeing what
happens) and have discovered:
The "Warning: warning: missing prefix `*' in absolute indirect
address, maybe misassembled!" probably doesn't matter, but I can make
it go away by changing
call (%eax)
to:
call *(%eax)
The perhaps serious error "relocation truncated to fit" is caused by
this line:
ljmp $KERNEL_CS, $EXT(_SMP_TRAMP_32_ENTRY_)
I can make it go away by moving the .code32 directive to the other
side of it, i.e. replacing
/* now go to 32-bit segment */
ljmp $KERNEL_CS, $EXT(_SMP_TRAMP_32_ENTRY_)
.code32
by:
.code32
/* now go to 32-bit segment */
ljmp $KERNEL_CS, $EXT(_SMP_TRAMP_32_ENTRY_)
This change may be a good one, because the there's comment immediately
following that says:
* [_SMP_TRAMP_32_ENTRY_ - 6] is the 32 bit address of the ljmp destination.
My empirical measurements indicate that the ljmp instruction takes
only 5 bytes in 16-bit mode, but 7 bytes in 32-bit mode.
All this in oskit/libsmp/x86/boot.S, so it may not be totally relevant
to L4 hackers ...
Edmund
More information about the l4-hackers
mailing list