Hi Segher,
thanks for looking into this! As per your request on IRC, attached are
the files which comprise the XIP code we are having problems with.
*.85.* has the non-extern variant of initram_printktest.c and does abort
with a linker error (duplicate symbols), *.86.* has the extern variant
and links fine.
Short list of files with explanations:
build/stage0-prefixed.85.o
build/stage0-prefixed.86.o
Object we link against with --just-symbols. It contains the non-PIC code
we want to call.
build/mainboard/emulation/qemu-x86/initram_xip.85.o
build/mainboard/emulation/qemu-x86/initram_xip.86.o
PIC object with "ret (*func)(args) = stage0_##func;" sequence, contains
main(), which calls printk() and printktest().
build/mainboard/emulation/qemu-x86/initram_printktest_xip.85.o
PIC object with "ret (*func)(args) = stage0_##func;" sequence, contains
printktest(), which calls printk().
build/mainboard/emulation/qemu-x86/initram_printktest_xip.86.o
PIC object with "extern ret (*func)(args);" sequence, contains
printktest(), which calls printk().
initram_printktest.85.i
initram_printktest.85.s
initram_printktest.86.i
initram_printktest.86.s
Preprocessed output of the above.
initram.85.i
initram.85.s
initram.86.i
initram.86.s
Assembler output of the above.
shortlog.85.txt
shortlog.86.txt
gcc/ld commands used.
build/linuxbios.initram.86.o
Final linked object. build/linuxbios.initram.85.o did not link.
Call sequence is as follows:
initram.c:main()
->printk()->stage0_printk()
->printk()->stage0_printk()
->printktest1()
->printk()->stage0_printk()
->printk()->stage0_printk()
->initram_printktest.c:printktest()
->printk()->stage0_printk() -----dies here
The generated code for printktest() is what we have problems with.
Regards,
Carl-Daniel